码迷,mamicode.com
首页 > 其他好文 > 详细

区间内素数的个数

时间:2018-04-21 23:33:09      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:筛法   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!