区间内素数的个数

给定整数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;
}
}
}

猜你喜欢

转载自www.cnblogs.com/RGBTH/p/8904176.html