简单题,狄利克雷卷积一下就好了。
最开始我还以为线性筛就可以了。怕是失了智。
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline long long read()
{
long long x=0,b=1;
char c=nc();
for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;
for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';
return x*b;
}
inline long long phi(long long x)
{
long long tmp=x;
for(long long i=2;i<=m;i++)
{
if(x%i)continue;
tmp=tmp/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)tmp=tmp/x*(x-1);
return tmp;
}
int main()
{
freopen("in.txt","r",stdin);
n=read();
m=sqrt(n);
for(int i=1;i<=m;i++)
{
if(n%i)continue;
ans+=n/i*phi(i);
if(i*i<n)ans+=i*phi(n/i);
}
cout<<ans;
return 0;
}