思路

这是一道裸的欧拉函数题目,先线性预处理。
对于所有n>2的欧拉函数进行前缀和,然后直接输出答案就可以了。

代码

#include<stdio.h>
typedef long long ll;
const int maxn=1e6+7;
int n,isn_pri[maxn],pri[maxn],phi[maxn],cnt;
ll sum[maxn];

void get(int N){
    isn_pri[1]=1;phi[1]=1;
    for(int i=2;i<=N;i++){
        if(!isn_pri[i]){
            pri[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&pri[j]*i<=N;j++){
            isn_pri[pri[j]*i]=1;
            if(i%pri[j]==0){
                phi[pri[j]*i]=phi[i]*pri[j];
                break;
            }else phi[pri[j]*i]=phi[i]*(pri[j]-1);
        }
    }
}

signed main(){
    get(maxn-5);
    for(int i=2;i<maxn;i++){
        sum[i]=sum[i-1]+phi[i];
    }
    while(scanf("%lld",&n)&&n){
        printf("%lld\n",sum[n]);
    }
    return 0;
}