https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239
杜教筛入门

#include<cstdio>
#include<map>
const int N=10000011,maxn=10000000;
const int mod=1e9+7;
typedef long long ll;
std::map<ll,ll>mp;
int pr[N];
bool ip[N];
int phi[N];
int sum[N];
inline void shai_fa(){
phi[1]=1ll;
for(register int i=2;i<=maxn;++i){
if(!ip[i])
phi[pr[++pr[0]]=i]=i-1;
for(register int j=1;j<=pr[0]&&pr[j]*i<=maxn;++j){
ip[i*pr[j]]=1;
if(i%pr[j]==0){
phi[i*pr[j]]=pr[j]*phi[i];
break;
}
phi[i*pr[j]]=phi[i]*phi[pr[j]];
}
}
for(register int i=1;i<=maxn;++i)
sum[i]=(sum[i-1]+phi[i])%mod;
}
ll T,n;
inline ll query(ll x){
if(x<=maxn)return sum[x];
if(mp[x])return mp[x];
ll ans=1ll*x%mod*(x%mod+1)/2;
ll pos;
for(register ll i=2;i<=x;i=pos+1){
pos=x/(x/i);
ans-=1ll*(pos-i+1)*query(x/i)%mod;
ans=(ans+mod)%mod;
}
return mp[x]=ans;
}
int main(){
shai_fa();
scanf("%lld",&n);
printf("%lld\n",query(n));
return 0;
}