給定整數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...