[笔记] 常见函数的线性筛法
约数个数函数
记d[i]为i的约数个数,e[i]为i的最小质因子个数。
void solve(){ d[1]=1; for(int i=2;i<=n;i++){ if(!isx[i]){prime[++cnt]=i;d[i]=2;e[i]=1;} for(int j=1;(i*prime[j]<=n)&&j<=cnt;j++){ int v=prime[j];isx[i*v]=1; if(i%v==0) {d[i*v]=d[i]/(e[i]+1)*(e[i]+2);e[i*v]=e[i]+1;break;} else d[i*v]=d[i]*2;e[i*v]=1; } if(d[i]>mx){mx=d[i];ans[++tot]=i;} } }
phi函数
//Writer:GhostCai && His Yellow Duck #include<iostream> #define MAXN 200000 using namespace std; int prime[MAXN]; bool istprime[MAXN]; int phi[MAXN]; void makePrime(int num){ int cnt=0; phi[1]=1; for(int i=2;i<=num;i++){ if(!istprime[i]) prime[++cnt]=i,phi[i]=i-1; for(int j=1;prime[j]*i<=num&&j<=cnt;j++){ istprime[i*prime[j]]=1; 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; cin>>n; makePrime(n); for(int i=1;i<=n;i++) cout<<i<<" "<<phi[i]<<endl; }
本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9367325.html