枚举一下约数k,求出gcd(m,n)==k的数量*k再求和就是答案,这个数就等于phi(n/k).
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll n,ans;
int m;
ll phi(ll x)
{
ll t=x;
for (int i=2;i<=m;i++)
if (x%i==0)
{
t=t/i*(i-1);
while (x%i==0) x/=i;
}
if (x>1) t=t/x*(x-1);
return t;
}
int main()
{
scanf("%lld",&n);
m=sqrt(n);
for (int i=1;i<=m;i++)
if (n%i==0)
{
ans+=(ll)i*phi(n/i);
if (i*i!=n) ans+=(ll)(n/i)*phi(i);
}
printf("%lld",ans);
return 0;
}