o(n)的复杂度,筛出各种神奇。
bzoj2190仪仗队
#include<iostream> #include<cstdio> using namespace std; int phi[40001]={0},prime[40001]={0}; bool flag[40001]={false}; void work(int n) { int i,j; for (i=2;i<=n;++i) { if (!flag[i]) { ++prime[0];prime[prime[0]]=i;phi[i]=i-1; } for (j=1;j<=prime[0]&&i*prime[j]<=n;++j) { flag[prime[j]*i]=true; if (i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main() { int n,ans=0,i; scanf("%d",&n); work(n); for (i=2;i<n;++i) ans+=phi[i]*2; ans+=3; if (n==1) printf("1\n"); else printf("%d\n",ans); }
时间: 2024-10-13 06:47:27