例:区间内素数的个数
题意:给定整数a和b,请问区间[a,b)以内有多少个素数? (a < b <= 10的12次幂, a - b <= 10的6次幂)
输入:
22 37
22801763489 22801787897
输出:
3
1000
typedef long long ll;
const int MAX_L = 1000000000000 + 10;
const int MAX_SQRT_B = 1000000 + 10;
bool is_prime[MAX_L];
bool is_prime_small[MAX_SORT_B];
//对区间[a, b)内的整数执行筛选。is_prime[i - a] = true ==== i是素数
void segment_sieve(ll a, llb)
{
for (int i = 0; (ll)i * i < b; i++){
is_prime_small[i] = true;
}
for (int i = 0; i < b - a; i++){
is_prime[i] = true;
}
for (int i = 2; (ll)i * i < b; i++){
if (is_prime_small[i]){
for (int j = 2 * i; (ll)j * j < b; j += i)
is_prime_small[j] = false; //筛[2,根号b)
for (ll j = max(2LL, (a + i - 1) / i) * i; j < b; j += i)
is_prime[j - a] = false; //筛[a, b)
}
}
}