筛素数,求区间内素数个数

Posted goto_1600

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了筛素数,求区间内素数个数相关的知识,希望对你有一定的参考价值。

问题 1525: [蓝桥杯][算法提高VIP]找素数

时间限制: 1Sec 内存限制: 128MB 提交: 1179 解决: 133

题目描述
给定区间[L, R] , 请计算区间中素数的个数。

数据规模和约定
2 < = L < = R < = 2147483647 R-L < = 1000000
输入
两个数L和R。
输出
一行,区间中素数的个数。
样例输入
2 11
样例输出
5

解题报告:用sqrt(r)以内的数筛掉r以内的所有合数,因为区间小于等于1e6开这么大的数组就够了,数组下标记录的是这个数和l的相对差。注意该题的大优化。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#define IL inline
#define x first
#define y second
typedef long long ll;
using namespace std;
const	int N=1000010;
bool f[N];
bool t[N];
void init(ll l, ll r)

	for(ll i=2;i*i<=r;i++)
	
		if(!f[i])
		
			for(ll j=2*i;j*j<=r;j+=i)
			f[j]=1;
			ll j=2*i;
			if(j<l)
				
				j+=(l-j)/i*i;//大优化 
				
			for(;j<r;j+=i)
			
				t[j-l]=true;
			
		
	

int main()

	ll l,r;
	cin>>l>>r;
	init(l,r+10);
	ll cnt=0;
	for(ll i=l;i<=r;i++)
	if(!t[i-l])	cnt++;
	cout<<cnt<<endl;
    return 0;





以上是关于筛素数,求区间内素数个数的主要内容,如果未能解决你的问题,请参考以下文章

筛素数

Help Hanzo (素数筛+区间枚举)

HDU 6069 Counting Divisors(区间素数筛法)

区间素数筛

hdu6069,2017多校1003

吉比特_笔试_区间内素数个数