您的位置:首页 > 其它

关于欧拉筛的一些想法

2017-08-19 16:26 288 查看
欧拉筛:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: