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

问题 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;
}




全部评论

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务