素数筛
Posted xxrll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛相关的知识,希望对你有一定的参考价值。
1. 思路:对于不超过n的每个非负整数p(>=2),删去除1*p外所有倍数,处理完所有数后还剩下的就是素数。
1 void prime() //复杂版 2 3 mem(vis); //是否被删去 4 for(int i=2;i<=n;i++) 5 for(int j=i*2;j<=n;j+=i) 6 vis[j]=1; 7
1 void prime() //优化版 2 3 int m=sqrt(n+0.5); 4 mem(vis); //是否被删去 5 for(int i=2;i<=m;i++) 6 if(!vis[i]) //用素数筛 7 for(int j=i*i;j<=n;j+=i) //防止重复筛 8 vis[j]=1; 9
2. 复杂度:内层循环次数是 ⌊n/i⌋ - 1< n/i,O(nlogn)
3. tips:①素数定理 --- Π(x) ~ x/lnx, 即不超过x的素数个数与x/lnx比较接近
以上是关于素数筛的主要内容,如果未能解决你的问题,请参考以下文章