shamiul93

Number Transformation UVa

Feb 12th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1.  
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. #include<vector>
  7. #include<cstdio>
  8.  
  9. using namespace std;
  10.  
  11. #define PII pair<int,int>
  12. #define ll long long int
  13.  
  14. ll prime[1010];
  15. vector<ll> v[1010];
  16.  
  17. ll s, t;
  18.  
  19. // 0,1 aren't counted...
  20. void seive()
  21. {
  22.  
  23.     for (ll i = 4; i < 1009; i+=2)
  24.     {
  25.         prime[i] = -1;
  26.     }
  27.  
  28.     for (ll i = 3; i <= 501; i+=2)
  29.     {
  30.         for (ll j = 2 * i; j <= 1003; j += i)
  31.         {
  32.             prime[j] = -1;
  33.         }
  34.     }
  35. }
  36.  
  37. void creategraph()
  38. {
  39.     for (ll i = 3; i <= 1000; i++)
  40.     {
  41.         if (i % 2 == 0)
  42.         {
  43.             v[i].push_back(2);
  44.         }
  45.         for (ll j = 3; j <= 1001; j += 2)
  46.         {
  47.             if (prime[j] == 0 && j!= i && j!=1 &&  i%j == 0)
  48.             {
  49.                 v[i].push_back(j);
  50.             }
  51.         }
  52.     }
  53. }
  54.  
  55. ll bfs()
  56. {
  57.     queue<ll> q;
  58.     int MoveNumber[1001];
  59.     ll sum;
  60.     memset(MoveNumber, -1, sizeof(MoveNumber));
  61.  
  62.     q.push(s);
  63.     MoveNumber[s] = 0;
  64.     while (!q.empty())
  65.     {
  66.         ll node;
  67.         node = q.front();
  68.         q.pop();
  69.         for (ll i = 0; i < v[node].size(); i++)
  70.         {
  71.             sum = node + v[node][i];
  72.             if (sum <= t && MoveNumber[sum] == -1)
  73.             {
  74.                 MoveNumber[sum] = MoveNumber[node] + 1;
  75.                 q.push(sum);
  76.                 if (sum == t)
  77.                     return MoveNumber[sum]; /// at this case , MoveNumber[sum] == MoveNumber[t]
  78.             }
  79.         }
  80.     }
  81.  
  82.     return MoveNumber[t];
  83. }
  84.  
  85. int main()
  86. {
  87. //    freopen("out.txt","w",stdout);
  88.     seive();
  89.     creategraph();
  90.  
  91.     ll T, ans, cs = 0  ;
  92.  
  93.     while (scanf("%lld %lld",&s , &t) && s && t)
  94.     {
  95.         cs++;
  96.         ans = bfs();
  97.         printf("Case %lld: %lld\n", cs, ans);
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment