回头看,轻舟已过万|

Ke_scholar

园龄:2年1个月粉丝:30关注:10

区间素数筛模板

例题素数密度

template<typename T>
struct segment_sieve {
vector<bool> is_prime, is_prime_small;
vector<T> prime;
segment_sieve() {
is_prime.resize(1000010);
is_prime_small.resize(1000100);
}
//对区间[a,b]内的整数执行筛法,is_prime[i-a]=true --- 表示i是素数 注意这里下标偏移了a,所以从0开始。
void get_num(T a, T b) {
if (a == 1) a = 2;
for (T i = 0; i * i <= b; ++i)
is_prime_small[i] = true; //对[2,sqrt(b))的初始化全为质数
for (T i = 0; i <= b - a; ++i)
is_prime[i] = true; //对下标偏移后的[a,b)进行初始化
for (T i = 2; i * i <= b; ++i) {
if (is_prime_small[i]) {
for (T j = 2 * i; j * j <= b; j += i)
is_prime_small[j] = false; //筛选[2,sqrt(b));
//(a+i-1)/i得到最接近a的i的倍数,最低是i的2倍,然后筛选
for (T j = max((T)2, (a + i - 1) / i) * i; j <= b; j += i)
is_prime[j - a] = false;
}
}
for (T i = 0; i <= b - a; ++i) //统计个数
if (is_prime[i])
prime.push_back(i + a);
}
};

本文作者:Ke_scholar

本文链接:https://www.cnblogs.com/Kescholar/p/17904984.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ke_scholar  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起