给定a,b求[a,b)区间内的素数数量(1 ≤ a ≤ b < 231, b - a ≤ 100000)
暴力线性筛mle,这时就要用到区间线性筛了,利用数组偏移,只需要筛一下(1,sqrt(b))
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
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;i*i<b;++i)
{
is_prime_small[i]=true;//对[2,sqrt(b))的初始化全为质数
}
for(ll i=0;i<b-a;++i)
{
is_prime[i]=true;//对下标偏移后的[a,b)进行初始化