线性筛求欧拉函数

来源:互联网 发布:淘宝优惠券推广 编辑:程序博客网 时间:2024/06/06 08:58

线性复杂度的原因是因为它保证了每个合数只会被筛到一次。
每个合数都可以表示成一个数与另一个质数的乘积。
if(i%p[j]==0)break 是因为大于p[j] 的那些素数 x 产生的乘积 ix 并不需要由i来筛得,而可以由 ix 的某个更大的合数因子来筛得,因为 i 至少有一个比 x 小的素数因子。

void init(){    int c=0;    phi[1]=1;    for(int i=2;i<N;++i)    {        if(!nop[i])        {            p[c++]=i;            phi[i]=i-1;        }        for(int j=0;j<c&&i*p[j]<N;++j)        {            nop[i*p[j]]=true;            if(i%p[j]==0)            {                phi[i*p[j]]=phi[i]*p[j];                break;            }            else phi[i*p[j]]=phi[i]*(p[j]-1);        }    }}
原创粉丝点击