点击这里查看原题
求sigma(gcd(i,n)),枚举n的约数k,s(k)表示满足gcd(i,n)=k(1<=i<=n)的i的个数,所以答案为sigma(k*s(k)),求s(k)即为求gcd(i/k,n/k),即为phi(n/k)。
/*
User:Small
Language:C++
Problem No.:2705
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
ll n,ans;
ll phi(ll n){
ll res=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n!=1) res=res/n*(n-1);
return res;
}
int main(){
freopen("data.in","r",stdin);//
scanf("%lld",&n);
int m=sqrt(n);
for(int i=1;i<=m;i++){
if(n%i==0){
ans+=(ll)i*phi(n/i);
if((ll)i*i!=n) ans+=(ll)(n/i)*phi(i);
}
}
printf("%lld\n",ans);
return 0;
}