区间筛——模板


在遇到数字很大但区间不大时,可以选用区间筛。

范围是【L, R】,不会把0, 1筛进去。

void getPrime(ll L, ll R)
{
    for(int i = 0; (ll)i * i <= R; i++) prime_base[i] = 1;
    for(int i = 0; i <= R - L; i++) prime[i] = 1;
    if(L < 2) L = 2;
    for(int i = 2; (ll) i * i <= R; i++)
    {
        if(prime_base[i])
        {
            for(ll j = 2 * i; (ll) j * j <= R; j += i) prime_base[j] = 0;
            for(ll j = max(2LL, (L + i - 1) / i) * i; j <= R; j += i) prime[j - L] = 0;
        }
    }
    for(ll i = 0; i <= R - L; i++)
    {
        if(prime[i]) prime[cnt++] = i + L;
    }
}

 

posted @ 2020-10-13 20:36  章楠雨  阅读(121)  评论(0编辑  收藏  举报