素数筛法
Posted 橘生淮南终洛枳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛法相关的知识,希望对你有一定的参考价值。
一、埃式筛法
埃式筛法的核心思想是从2到n枚举,当我们找到一个质数时,枚举它所有的倍数,因为这些倍数都不可能是质数。
for(int i=2; i<=n; i++) { if(!vis[i]) { prime[++cnt]=i; for(int j=i*2; j<=n; j+=i) vis[j]=true; } }
时间复杂度是O(n log log n)
如果无论质数合数,每次都去找倍数的话,复杂度会退化成O(n|n n)
二、欧拉筛(线性筛)
欧拉筛的核心思想是通过让每个数只会被它的最小的质因子筛到,从而每个数只会被筛一次,时间复杂度O(n)
对于任意一个合数,我们可以拆成最小质因子*某数i的形式。我们枚举某数i,然后在枚举所有筛出的质数。
当我们枚举的质数可以整除i时,如果再往大里枚举,枚举的质数就不可能是最小质数了,这时就可以终止循环,继续枚举下一个i了
for(int i=2; i<=n; i++) { if(!isprime[i]) prime[++primesize]=i; for(int j=1; j<=primesize && i*prime[j]<=n; j++) { isprime[i*prime[j]]=1; if(i%prime[j]==0) break; } }
自己选的路,跪着也要走完!!!
以上是关于素数筛法的主要内容,如果未能解决你的问题,请参考以下文章