欧拉筛:
void euler(int n)
{
isprime[1]=true;
for(int i=2;i<=n;i++)
{
if(!isprime[i]) prime[++tot]=i;
for(int j=1;j<=tot && i*prime[j]<=n;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0) break;//神奇的代码
}
}
}
if(i%prime[j]==0) break;
保证每个合数只会被它最小的质因子筛去,所以欧拉筛复杂度为o(n);
原因:
prime[]数组中的素数是递增的,当i能整除prime[j],那么i*prime[j+1]这个合数肯定被prime[j]乘以某个数筛掉;
因为i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那么i*prime[j+1]=(k*prime[j])*prime
[j+1]=k’*prime[j],接下去的素数同理。所以不用筛下去了。因此,在满足i%prime[j]==0这个条件之前以及第一次满足改条件时,prime[j]必定是prime[j]*i的最小因子。
来自:http://www.cnblogs.com/zhuohan123/p/3233011.html;