[数论]-----欧拉筛法的应用
文章目录
- 1.求1~n之间的所有质数
- 2.求1~n之间所有自然数的欧拉函数φ(x)
- 3.求1~n之间的每个数的因子个数
- 详细推导:
- 代码:
- 4.求1~n之间每个数的因数和
- 详细的推导:
- 代码:
- 筛法求莫比乌斯函数
1.求1~n之间的所有质数
欧拉筛法核心思想:每个合数只被自己的最小质因子筛一次
2.求1~n之间所有自然数的欧拉函数φ(x)
3.求1~n之间的每个数的因子个数
详细推导:
代码:
void Euler(){memset(isprime,1,sizeof isprime); d[1]=1;for(int i=2;i<=n;i++){if(isprime[i]){prime[++tot]=i;d[i]=2;num[i]=1;}for(int j=1;j<=tot&&i*prime[j]<=n;j++){isprime[i*prime[j]]=0;if(i%prime[j]==0){d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);num[i*prime[j]]=num[i]+1; break;}else{d[i*prime[j]]=d[i]*2;num[i*prime[j]]=1;}}}
}
4.求1~n之间每个数的因数和
详细的推导:
代码:
O(n)
void Euler()
{ans[1]=1;for(LL i=2;i<=r;i++){if(!vis[i]){prime[++cnt]=i;s[i]=psum[i]=i+1;//i是质数 vis[i]=1;}for(LL j=1;j<=cnt&&prime[j]<=r/i;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){psum[i*prime[j]]=psum[i]*prime[j]+1;s[i*prime[j]]=s[i]/psum[i]*psum[i*prime[j]];break;}else{psum[i*prime[j]]=prime[j]+1;s[i*prime[j]]=s[i]*s[prime[j]];}}}
}