[SDOI2012]Longge的问题
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。
这道题模拟一下样例:
1: 1,5
2: 2,4
3:3
6:6
sum=1*2+2*2+3*1+6*1=15
我们发现2中有的数目就是除以2后和n除以2后互质的数的个数,就是phi(n/2)啦
同理求个和就行。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define ll long long using namespace std; ll n,ans=0; ll phi(ll x) { if(x==1) return 1; ll sqr_=sqrt(x); ll tot=x; for(ll i=2;i<=sqr_&&x;i++) { if(x%i==0) tot=tot*(i-1)/i; while(x%i==0) { x/=i; } } if(x>1) tot=tot*(x-1)/x; return tot; } int main() { scanf("%lld",&n); ll sqr=sqrt(n); for(ll i=1;i<=sqr;i++) if(n%i==0) { ans+=i*phi(n/i); if(i*i<n)ans+=phi(i)*(n/i); //cout<<n/i<<' '<<phi(n/i)<<' '<<ans<<endl; } cout<<ans<<endl; }