线性筛法(欧拉筛)有关

关于筛法

埃筛(Eratosthenes筛法)人人都会

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

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


欧拉筛(线性筛法)

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

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

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

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

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


code

好写得很

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

你可能感兴趣的:(数论)