Euler.cpp 579 B

12345678910111213141516171819202122232425262728
  1. const int maxn = 100000;
  2. // Compute phi(n);
  3. int euler_phi(int n) {
  4. int m = (int) sqrt(n + 0.5);
  5. int ans = n;
  6. for(int i = 2; i <= m; i++)
  7. if(n % i ==0) {
  8. ans = ans / i * (i-1);
  9. while(n % i ==0)
  10. n /= i;
  11. }
  12. if(n > 1)
  13. ans = ans / n * (n-1);
  14. return ans;
  15. }
  16. // Compute all phi(1), phi(2), ... , phi(n)
  17. int phi[maxn];
  18. void phi_table(int n) {
  19. for(int i = 2; i <= n; i++)
  20. phi[i] = 0;
  21. phi[1] = 1;
  22. for(int i = 2; i <= n; i++)
  23. if(!phi[i])
  24. for(int j = i; j <=n; j += i) {
  25. if(!phi[j]) phi[j] = j;
  26. phi[j] = phi[j] / i *(i-1);
  27. }
  28. }