您的位置:首页 > 其它

[原博客] 关于线性筛

2014-09-07 23:55 148 查看
埃氏筛法:从2开始,找到第一个没有被筛的数,把它标记为素数,然后把它的2倍、3倍……筛掉。
复杂度
O(nlogn)


改进的埃氏筛法:从2开始,找到第一个没有被筛的数
x
,把它标记为素数,然后把它的
x
倍、
x+1
倍……筛掉。
复杂度
O(nloglogn)


线性筛:保证每个数都被它的最小素因子筛掉。
复杂度
O(n)


C++写起来大概是这样的:

int mindiv[10000005],tot,prime[10000050],phi[10000050];
int main(){
for(int i=2;i<=10000000;i++){
if(!mindiv[i]){
mindiv[i]=i;prime[tot++]=i;phi[i]=i-1;//1
}
for(int j=0;prime[j]*i<=10000000;j++){
mindiv[prime[j]*i]=prime[j];
if(prime[j]==mindiv[i]){
phi[prime[j]*i]=phi[i]*prime[j] ;break;//2
}
phi[prime[j]*i]=phi[i]*(prime[j]-1);//3
}
}
return 0;
}


View Code

这样就求出了2~1000w的欧拉函数。
方便快捷。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: