现在的位置: 首页 > 综合 > 正文

POJ2480(欧拉函数求最大公约数之和) POJ2480(欧拉函数求最大公约数之和)

2017年11月04日 ⁄ 综合 ⁄ 共 1200字 ⁄ 字号 评论关闭
 

POJ2480(欧拉函数求最大公约数之和)

分类: 数论 53人阅读 评论(0) 收藏 举报

题目:Longge's problem

 

题意:calculate ∑gcd(i, N) 1<=i <=N.   又一个水题,为了加深印象。

转化为欧拉函数之和即可。注意不要直接枚举,那样会超时,应sqrt枚举。

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <iostream>  
  4. using namespace std;  
  5. #define N 1000005  
  6.   
  7. typedef long long LL;  
  8.   
  9. bool prime[N];  
  10. LL p[N];  
  11. LL k=0;  
  12.   
  13. void isprime()  
  14. {  
  15.     LL i,j;  
  16.     memset(prime,true,sizeof(prime));  
  17.     for(i=2;i<N;i++)  
  18.     {  
  19.         if(prime[i])  
  20.         {  
  21.             p[k++]=i;  
  22.             for(j=i+i;j<N;j+=i)  
  23.             {  
  24.                 prime[j]=false;  
  25.             }  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. LL phi(LL n)  
  31. {  
  32.     LL rea=n,i;  
  33.     for(i=0;p[i]*p[i]<=n;i++)  
  34.     {  
  35.         if(n%p[i]==0)  
  36.         {  
  37.             rea=rea-rea/p[i];  
  38.             while(n%p[i]==0) n/=p[i];  
  39.         }  
  40.     }  
  41.     if(n>1)  
  42.         rea=rea-rea/n;  
  43.     return rea;  
  44. }  
  45.   
  46. int main()  
  47. {  
  48.     LL i,n,ans;  
  49.     isprime();  
  50.     while(cin>>n)  
  51.     {  
  52.         ans=0;  
  53.         for(i=1;i*i<=n;i++)  
  54.         {  
  55.             if(i*i==n)  
  56.                 ans+=i*phi(n/i);  
  57.             else if(n%i==0)  
  58.                 ans+=i*phi(n/i)+(n/i)*phi(i);  
  59.         }  
  60.         cout<<ans<<endl;  
  61.     }  
  62.     return 0;  
  63. }  

抱歉!评论已关闭.