枚举gcd,求出当前枚举的gcd出现的次数,也就是求个欧拉函数
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define ll long long
using namespace std;
ll n,ans,m;
long long phi(ll x)
{
ll ans=x,y=sqrt(x);
for(int i=2;i<=y;i++)
if(x%i==0)
{
ans=ans/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)ans=ans/x*(x-1);
return ans;
}
int main()
{
cin>>n;m=sqrt(n);
for(int i=1;i<=m;i++)
if(n%i==0)
{
ans+=phi(n/i)*i;
if(i*i!=n)ans+=phi(i)*(n/i);
}
cout<<ans;
return 0;
}