#素数判定之欧拉筛
欧拉筛是在埃氏筛法的优化版,它避免了一个数被重复地筛,比如在埃氏筛法中,30= 2 * 15=3 * 10=5 * 6;那么每经过一个因子,30都会被筛一次,这就造成了重复筛,所以在欧拉筛中对这一问题进行了解决,即使每个合数都只被他的最小因子筛一次,这就达到了我们缩短时间的目的。
下面来看代码。
const int N=1e7+5;
bool ok[N];
int prim[N];
int pos=0;
void p(int n)
{
for(int i=2;i<=n;i++)
{
if(ok[i]==0)
{
prim[pos++]=i;
}
for(int j=0;j<pos;j++)
{
if(i*prim[j]>n)
break;//已经超出了你要判断的范围
ok[i*prim[j]]=1;//prim[j]是素数,那么他的倍数必定是合数
if(i%prim[j]==0)
break;//i是某个素数的倍数,之前已经判断过了,所以直接跳出
}
}
}