线性筛 板子整理
线性筛筛素数:
void getxxs(int N){ for(int i=2;i<=N;i++){ v[i]=1; } for(int i=2;i<=N;i++){ if(v[i]==1){ prime[++num]=i; } for(int j=1;j<=num&&i*prime[j]<=N;j++){ v[i*prime[j]]=0; if(i%prime[j]==0){ break; } } } }
线性筛筛欧拉函数:
void getxxs(int N){ for(int i=2;i<=N;i++){ v[i]=1; } for(int i=2;i<=N;i++){ if(v[i]){ prime[++num]=i; phi[i]=i-1; } for(int j=1;i*prime[j]<=N&&j<=num;j++){ v[i*prime[j]]=0; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else{ phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } }
线性筛筛莫比乌斯函数:
getxxs(int N){ for(int i=2;i<=N;i++){ v[i]=1; } mu[1]=1; for(int i=2;i<=N;i++){ if(v[i]){ prime[++num]=i; mu[i]=-1; } for(int j=1;j<=num&&i*prime[j]<=N;j++){ v[i*prime[j]]=0; if(i%prime[j]==0){ mu[i*prime[j]]=0; break; }else{ mu[i*prime[j]]=-mu[i]; } } } }