std正解
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std ; const int maxn=1e7+10; int n,orz; long long phi[maxn+10],pri[maxn+10]; long long ans; bool vis[maxn+10]; inline void get_prime(){ vis[1]=1;phi[1]=1; for(int i=2;i<=maxn;i++){ if(!vis[i]) pri[++orz]=i,phi[i]=i-1; for(int j=1;j<=orz&&pri[j]*i<=maxn;j++){ vis[i*pri[j]]=1; if(!(i%pri[j])) {phi[i*pri[j]]=phi[i]*pri[j];break;} phi[i*pri[j]]=phi[i]*phi[pri[j]]; } } for(int i=2;i<=maxn;i++) phi[i]+=phi[i-1]; } int main() { get_prime(); scanf("%d",&n); for(int i=1;i<=orz&&pri[i]<=n;i++) ans+=((1ll*2*phi[n/pri[i]])-1); printf("%lld ",ans); return 0; }