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

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




全部评论

相关推荐

11-27 17:08
已编辑
牛客_产品运营部_私域运营
腾讯 普通offer 24k~26k * 15,年包在36w~39w左右。
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务