區間素數篩

2021-08-28 23:17:28 字數 588 閱讀 6790

給定整數a和b,請問區間[a,b)內有多少個素數? 

ab-a<=10^6

因為b以內合數的最小質因數一定不超過sqrt(b),如果有sqrt(b)以內的素數表的話,就可以把篩選法用在[a,b)上了,先分別做好[2,sqrt(b))的表和[a,b)的表,然後從[2,sqrt(b))的表中篩得素數的同時,也將其倍數從[a,b)的表中劃去,最後剩下的就是區間[a,b)內的素數了。

typedef long long ll;

const int maxn = 1000005;

bool is_prime[maxn];

bool is_prime_small[maxn];

ll prime[maxn];

ll prime_num=0;

//對區間[a,b)內的整數執行篩法,is_prime[i-a]=true --- 表示i是素數 注意這裡下標偏移了a,所以從0開始。

void segment_sieve(ll a,ll b)

}for(ll i=0;iif(is_prime[i]) prime[prime_num++]=i+a;

}

區間素數篩

題目 p1835 素數密度 題目中區間的端點很大,但是區間的長度不長.解題思路 1.先用埃氏篩選掉 1 到 sqrt r 的合數 2.用第一步的素數表篩選掉 l 到 r 的合數 一二步一起進行 3.計算素數個數 includeusing namespace std const int ma 1e6 ...

大數區間素數篩

給定a,b求 a,b 區間內的素數數量 1 a b 231,b a 100000 暴力線性篩mle,這時就要用到區間線性篩了,利用陣列偏移,只需要篩一下 1,sqrt b include include include using namespace std typedef long long ll...

模板 區間篩素數

原理 乙個數的倍數肯定不是素數 若給定子區間 fst,lst 則必有區間內任意數最大的因子是sqrt lst 因此只需要將2 sqrt lst 中的所有質數的倍數從區間 fst,lst 中劃掉即可 剩下的就是區間內的素數 注意兩個情況 1.第一次篩出的素數就在區間裡 要特判 2.將區間 fst,ls...