P2158/bzoj2190 [SDOI2008]仪仗队

P2158 [SDOI2008]仪仗队

欧拉函数

计算下三角的点数再*2+1

观察斜率,自行体会

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long phi[40002],ans;
int pri[40002],cnt,n;
bool v[40002];
void getphi(){
    phi[1]=1;
    for(int i=2;i<=n;++i){
        if(!v[i]) pri[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt;++j){
            int t=i*pri[j];
            if(t>n) break;
            v[t]=1;
            if(i%pri[j]) phi[t]=phi[i]*(pri[j]-1); 
            else{phi[t]=phi[i]*pri[j];break;}
        }
    }
}
int main(){
    scanf("%d",&n); --n;
    if(!n) {printf("0"); return 0;}
    getphi();
    for(int i=1;i<=n;++i) ans+=phi[i];
    printf("%lld",ans*2+1);
    return 0;
}

 

posted @ 2018-10-11 20:40  kafuuchino  阅读(147)  评论(0编辑  收藏  举报