P2158/bzoj2190 [SDOI2008]仪仗队

时间:2023-03-09 00:57:13
P2158/bzoj2190 [SDOI2008]仪仗队

P2158 [SDOI2008]仪仗队

欧拉函数

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

观察斜率,自行体会

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