P2158/bzoj2190 [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; }