题意:∑gcd(i, N) 1<=i <=N
思路:结论是∑gcd(i, N) = ∑(d|N) d*phi[N/d],phi[N / d]就是1 - N中与N最大公约数为d的个数,因为phi[n]表示小于等于n且与n互质的数的个数,那么n除去d这个因子后所求的欧拉函数值正是乘了d以后与N最大公约数为d的数的个数所以直接用公式即可
#include<iostream> #include<cstdio> #include<cstring> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=105; const int inf=0x3f3f3f3f; typedef long long LL; LL getphi(int x) { LL ans=x; for(LL i=2;i*i<=x;i++) { if(x%i==0) { ans-=ans/i; while(x%i==0) { x/=i; } } } if(x>1) { ans-=ans/x; } return ans; } int main() { LL n; while(scanf("%lld",&n) != EOF && n) { LL ans=0; for(LL i=1;i*i<=n;i++) { if(n%i==0) { ans+=i*getphi(n/i); if(i*i!=n) ans+=n/i*getphi(i); } } printf("%lld\n",ans); } }