Longge的问题(bzoj 2705)
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
/* 想了很长时间,实在没想出怎么做。 正解貌似很简单,设k=gcd(i,n),那么1=gcd(i/k,n/k),那么如果我们知道了K,可以用欧拉函数解出i的个数,把所有i的个数加起来就行了, 至于枚举K,就是枚举n的因数。 */ #include<cstdio> #include<iostream> #define lon long long using namespace std; lon n,ans; lon oula(lon x){ lon res=x,a=x; for(lon i=2;i*i<=a;i++){ if(a%i==0){ res-=res/i;//res=res*(1-1/i) while(a%i==0) a/=i; } } if(a>1) res-=res/a; return res; } int main(){ cin>>n; for(lon i=1;i*i<=n;i++){ if(n%i) continue; ans+=oula(n/i)*i; if(i*i!=n) ans+=oula(i)*(n/i); } cout<<ans; }