~素数数目~~~~区间筛法

题目描述(这里可以点哦)
给定区间[L,R],计算区间素数个数。
输入
输入两个整数L,R(1<=L<=R<=10^12,R-L<=1000000)
输出
输出一行表示区间素数的个数
样例输入 Copy
2 11
样例输出 Copy
5

素数个数问题,一般就是用埃氏筛法(复杂度O(nloglogn)),这题自然也不例外,具体思路如下:
第一步,用埃氏筛法得到1 ~ R1/2之间的全部素数;
第二步,用第一步得到的素数表把区间 [ L,R ]中的所有合数筛去;
第三部,统计剩下的素数个数;

事实上第一步和第二步是放在一起进行的,代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+1;
bool f[N],t[N];//需要筛两个区间
LL L,R;
LL S_sieve(LL l,LL r){//区间筛法 
	if(l==1)t[1]=true;
	for(LL i=2;i*i<=r;++i){
		//筛选2~sqrt(r)之间的素数 
		if(f[i])continue;
		for(LL j=2*i;j*j<=r;j+=i){   //j不能等i*i
			f[j]=true;
		}
		//用筛选出的质数筛去区间l~r的合数 
		LL s=max((l-1)/i+1,i);       //保守i*i 
		for(LL j=s*i;j<=r;j+=i){
			t[j-l+1]=true;
		}
	}	
	LL sum=0; //统计区间内素数个数
	for(LL i=1;i<=r-l+1;++i){
		if(t[i])continue;
		++sum;
	}
	return sum;
}
int main(){
	cin>>L>>R;
	cout<<S_sieve(L,R)<<endl;
	return 0;
}

温馨提示:如果你的代码提交之后,出现运行错误,请留意第四处注释。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章