Advertisement
Kaidul

UVA -10179

Dec 17th, 2012
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <complex>
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <ctime>
  10. #include <deque>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <list>
  14. #include <map>
  15. #include <memory>
  16. #include <queue>
  17. #include <set>
  18. #include <sstream>
  19. #include <stack>
  20. #include <string>
  21. #include <utility>
  22. #include <vector>
  23. #include <iomanip>
  24.  
  25. using namespace std;
  26.  
  27. #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
  28. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  29. #define RFOR(i,a,b) for(__typeof(b) i=(a); i>(b); i--)
  30. #define RESET(t,value) memset((t), value, sizeof(t))
  31. typedef long long int64;
  32. typedef long double d64;
  33. #define READ(f) freopen(f, "r", stdin)
  34. #define WRITE(f) freopen(f, "w", stdout)
  35. #define PI acos(-1.0)
  36. #define INF (1<<30)
  37. #define eps 1e-8
  38. #define pb push_back
  39. #define ppb pop_back
  40. #define pii pair<double,double>
  41. #define G struct node
  42.  
  43. template< class T > T gcd(T a, T b) { return (b != 0 ? gcd<T>(b, a%b) : a); }
  44. template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); }
  45. template< class T > void setmax(T &a, T b) { if(a < b) a = b; }
  46. template< class T > void setmin(T &a, T b) { if(b < a) a = b; }
  47.  
  48. int GCD(int a, int b){return (b == 0 ? a : GCD(b, a % b));}
  49. int LCM(int a, int b){ return (a * (b/ GCD(a, b))); }
  50. int ABS(int a) {return ((a >= 0) ? a : -a); }
  51.  
  52. vector < int > pset;
  53. void initSet(int _size){ pset.resize(_size); FOR(i,0,_size-1) pset[i]=i;}
  54. int findSet(int i){return (pset[i]== i)?i: (pset[i] = findSet(pset[i]));}
  55. void unionSet(int i,int j){ pset[findSet(i)]=findSet(j);}
  56. bool isSameSet(int i,int j){ return findSet(i)==findSet(j);}
  57.  
  58. #define Max 1000000000
  59. long long status[(Max/32)+2];
  60. vector <long long> primeList, temp;
  61. vector<long long>::iterator k;
  62.  
  63. set <long long> primeFactor;
  64. set<long long>::iterator it;
  65.  
  66. bool Check(long long N,long long pos){return (bool)(N & (1<<pos));}
  67. long long Set(long long N,long long pos){ return N=N | (1<<pos);}
  68.  
  69. void RSieve(long long N)
  70. {
  71.      primeList.clear();
  72.      long long i, j, sqrtN;
  73.      sqrtN = long( sqrt( N ) );
  74.      for( i = 3; i <= sqrtN; i += 2 )
  75.      {
  76.          if( Check(status[i>>5],i&31)==0)
  77.          {
  78.              for( j = i*i; j <= N; j += (i<<1) )
  79.              {
  80.                  status[j>>5]=Set(status[j>>5],j & 31)   ;
  81.              }
  82.          }
  83.      }
  84.      primeList.pb(2);
  85.      for(i=3;i<=N;i+=2)
  86.          if( Check(status[i>>5],i&31)== 0) primeList.pb(i);
  87. }
  88.  
  89. void factors(long long n){
  90.     primeFactor.clear();
  91.  
  92.         REP(i, temp.size()){
  93.             long long p = temp[i];
  94.             while(n % p == 0){
  95.                 n = n / p;
  96.                 primeFactor.insert(p);
  97.             }
  98.         }
  99. }
  100. int main()
  101. {
  102.     READ("input.txt");
  103.     long long n;
  104.     RSieve(999999999);
  105.     while(cin>>n)
  106.     {
  107.         if(n == 0) return 0;
  108.         for(k = primeList.begin(); *k <= n; k++) temp.pb(*k);
  109.         factors(n);
  110.         long long res = n;
  111.         for(it = primeFactor.begin(); it != primeFactor.end();it++){
  112.             res = ceil(res*(1- 1/ float(*it)));
  113.         }
  114.         cout<<res<<endl;
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement