筛素数,求区间内素数个数
问题 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;
}