bzoj2705
参考:http://blog.csdn.net/popoqqq/article/details/39119649
就是求欧拉函数,注意求1的欧拉函数时,这个题中需要时1,即(1,1)互素。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; long long int fef(long long int x){ if(x==1){ return 1; } else{ long long int ans=1; for(long long int i=2;i*i<=x;i++){ long long int temp=1; while(x%i==0){ x=x/i; temp=temp*i; } if(temp==1){ continue; } else{ ans=ans*(temp-temp/i); } } if(x!=1){//注意这里,不能忘记情况,出循环后x有可能不是1,否则会错。 ans=ans*(x-1); } return ans; } } int main(){ long long int n; long long int ans=0; scanf("%lld",&n); for(long long int i=1;i*i<=n;i++){ if(n%i==0){ ans+=fef(n/i)*i;//当n/i==1的时候,与1互素的包括(1,1) if(i*i!=n){ ans+=fef(i)*(n/i); } } } printf("%lld\n",ans); }