线性筛法(欧拉筛)有关

关于筛法

埃筛(Eratosthenes筛法)人人都会

  • 思想就是质数的倍数一定不是质数

埃筛瓶颈在于时间是 O ( n l o g 2 2 n ) ,数据太大会TLE
怎么办呢?


欧拉筛(线性筛法)

  • 线性筛可以做到 O ( n )

  • 思考筛到当前第 i 个数,第 j 个质数

  • 不像埃筛,如果 p [ j ] | i 就直接 b r e a k

  • 因为 p [ j ] i 的约数,所以 p [ j ] | i p [ j + 1 ]

  • 这样后面的不用再筛了,均摊下来是 O ( n ) 时间复杂度


code

好写得很

void init() 
{
    memset(bz,1,sizeof(bz));
    tot=0;
    for (int i=2;i<MAXN;i++) 
    {
        if (bz[i])p[tot++]=i;
        for (int j=0;j<tot && i*p[j]<=MAXN;j++) 
        {
            bz[i*p[j]]=0;
            if (i%p[j]==0)break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/enjoy_pascal/article/details/80372454