已知
∑d|nφ(d)=n
证明:设S(n)=∑ni=1φ(i)
因为
∑d|nφ(d)=n
∑ni=1∑d|iφ(d)=n∗(n+1)/2
∑ni=1∑d|iφ(d)=∑ni=1∑⌊n/d⌋d=1φ(d)=∑ni=1S(⌊n/i⌋)=S(n)+∑ni=2S(⌊n/i⌋)
从而可以得出S(n)=n∗(n+1)/2−∑ni=2S(⌊n/i⌋)
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#define ll long long
using namespace std;
bool ip[19999999];
ll N;
ll pr[10000001],a[10000009],phi[10000009],s[10000009],tot;
void prepare(){
ip[1]=1;phi[1]=1;
for(ll i=2;i<=10000000;i++){
if(!ip[i]) {
pr[++tot]=i;
phi[i]=i-1;
}
for(ll j=1;j<=tot&&i*pr[j]<=10000000;j++){
ip[i*pr[j]]=1;
ll w=0;
if(i%pr[j]!=0) w=1;
phi[i*pr[j]]=1ll*phi[i]*(pr[j]-w);
if(!w) break;
}
}
for(ll i=1;i<=10000000;i++)
s[i]=s[i-1]+phi[i];
}
ll work(ll n){
ll ans=1ll*n*(n+1)/2;
if(n<=10000000) return s[n];
for(ll i=2,last;i<=n;i=last+1)
{
last=n/(n/i);
ans-=1ll*(last-i+1)*work(n/i);
}
return ans;
}
int main(){
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%lld",&N);
prepare();
if(N<=10000000)printf("%lld",s[N]);
else {
ll ans=work(N);
printf("%lld",ans);
}
}