标签:筛法 bsp 多少 eve 整数 素数 个数 解决 nbsp
给定整数a,b,问区间[a,b)内有多少素数?
a<b<=10^12
b-a<=10^6
首先想到暴力,但是暴力如果如果朴素判断的话,时间复杂度在O((b-a)*a^(1/2))~O((b-a)*b^(1/2))之间,大概为O(10^12),效率太低,肯定超时。
再想到埃氏筛法,ans=sieve(b)-sieve(a),先打出10^12的表,但时间复杂度和空间复杂度均达到了10^12,还是不行。
但是我们知道,b以内的合数的最小质因数不超过b^(1/2),如果有b^(1/2)以内的素数表,又有[a,b)的整数表,我们就可以进行只筛[a,b)内的数了,
时间复杂度也接近b-a,O(10^6),就能解决问题了
代码:
const int max_sqrt_b=1000000;
bool is_prime[1000005];
bool is_prime_small[max_sqrt_b];
// 对区间[a,b)内的整数实行筛法。is_prime[i-a]=true,i是素数
void segment_sieve(ll a,ll b){
for(int i=0;(ll)i*i<b;i++)is_prime_small[i]=true;
for(int i=0;(ll)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;
for(ll j=max(2LL,(a+i-1)/i)*i;(ll)j<b;j+=i)is_prime[j-a]=false;
}
}
}
标签:筛法 bsp 多少 eve 整数 素数 个数 解决 nbsp
原文地址:https://www.cnblogs.com/RGBTH/p/8904176.html