题解:
欧拉函数
首先枚举gcd(n,i),然后计数
也就是求phi(n/i)
暴力枚举即可
代码:
#include<bits/stdc++.h> using namespace std; #define int long long const int N=100005; int n,ans,flag[N],p[N]; int phi(int x) { int ans=x; for (int i=1;p[i]*p[i]<=x;i++) if (x%p[i]==0) { ans=ans/p[i]*(p[i]-1); while (x%p[i]==0)x/=p[i]; } if (x!=1)ans=ans/x*(x-1); return ans; } void init() { for (int i=2;i<N;i++) if (!flag[i])for (int j=i*i;j<N;j+=i) flag[j]=1; for (int i=2;i<N;i++) if (!flag[i])p[++p[0]]=i; } signed main() { cin>>n; init(); for (int i=1;i*i<=n;i++) if (n%i==0) { ans+=i*phi(n/i); if (i*i<n)ans+=(n/i)*phi(i); } cout<<ans; return 0; }