P2303 [SDOi2012]Longge的问题
题目背景
SDOi2012
题目描述
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
输入输出格式
输入格式:
一个整数,为N。
输出格式:
一个整数,为所求的答案。
输入输出样例
说明
对于60%的数据,0<N<=2^16
对于100%的数据,0<N<=2^32
//Pro:P2303 [SDOi2012]Longge的问题 //仍然是考虑让gcd(i,n)=d //那么gcd(i/d,n/d)=1 //所以gcd(i,n)=d的i的个数就有phi(n/d)个 //但是n<=2^32,开不下数组,所以要一个数一个数算 //ans+=phi(n/d)*d+phi(d)*(n/d) #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; long long n; long long getphi(long long x) { long long res=x,tmp=x,i=2; for(;i*i<=x;++i) { if(tmp%i) continue; res-=res/i; while(tmp%i==0) tmp/=i; } if(tmp>1) res-=res/tmp; return res; } long long ans; int main() { scanf("%lld",&n); long long g=sqrt(n); for(long long i=1,d;i<=g;++i) { if(n%i==0) { d=n/i; ans+=getphi(d)*i+getphi(i)*d; } } if(g*g==n) ans-=getphi(g)*g; printf("%lld",ans); return 0; }