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\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/qseer/p/9563230.html