poj2480 gcd(i,n)和:欧拉函数
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 int cnt,prime[50005],vis[50005]; 5 int oula(int k) 6 { 7 if (k==1) return 1; 8 int sqr=(int)sqrt(1.0*k),temp=k,i,flag=0; 9 for (i=1;i<=cnt&&prime[i]<=sqr;i++) 10 if (k%prime[i]==0) 11 { 12 flag=1; 13 temp=temp/prime[i]*(prime[i]-1); 14 while (k%prime[i]==0) k/=prime[i]; 15 } 16 if (flag==0) return k-1; 17 if (k!=1) temp=temp/k*(k-1); 18 return temp; 19 } 20 int main() 21 { 22 int i,j,n,sqr; 23 long long ans; 24 memset(vis,0,sizeof(vis)); 25 vis[1]=1; cnt=0; 26 for (i=2;i<=50000;i++) 27 if (!vis[i]) 28 { 29 prime[++cnt]=i; 30 for (j=2;i*j<=50000;j++) vis[i*j]=1; 31 } 32 while (~scanf("%d",&n)) 33 { 34 ans=0; 35 sqr=(int)sqrt(1.0*n); 36 for (i=1;i<=sqr;i++) 37 if (n%i==0) 38 { 39 j=n/i; 40 ans=ans+i*oula(j); 41 if (j!=i) ans=ans+j*oula(i); 42 } 43 printf("%lld\n",ans); 44 } 45 }
http://poj.org/problem?id=2480
补个坑:欧拉函数根号做法不用求素数了,类似上一题做法:
1 LL phi(LL x) 2 { 3 LL ans=x; 4 for(LL i=2;i*i<=x;i++) 5 if(x%i==0){ 6 ans=ans/i*(i-1); 7 while(x%i==0) x/=i; 8 } 9 if(x>1) 10 ans=ans/x*(x-1); 11 return ans; 12 }