#include<bits/stdc++.h>
using namespace std;
const int N=1e6+9;
int l,r;
double pr[N];//空间压缩成1e6因为r-l<=1e6
bool hs[N];
int xxs(int n){
for (int i=2;i<=sqrt(n);i++){//埃氏筛
if (!hs[i]){
for (int j=i*2;j<=n;j+=i){
hs[j]=true;
}
}
}
int cnt=0;
for (int i=2;i<=n;i++){//记录+统计质数
if (!hs[i]){
pr[++cnt]=i;
}
}
return cnt;
}
int main()
{
int cnt=xxs(50000);
cin>>l>>r;
memset(hs,false,sizeof(hs));
for (int i=1;i<=cnt;i++){//枚举每个质数
//找在区间内第一个i的倍数
//第1种情况l<=第i个质数则j为2*pr[i]
//第2种情况l>pr[i]则j为l/pr[i]上取整*pr[i]
//两种情况打擂台
//利用默认下取整性质所以的向上取整也可写作(l+pr[i]-1)/pr[i]
for (long long j=max(2*pr[i],ceil(l*1.0/pr[i])*pr[i]);j<=r;j+=pr[i]){
hs[j-l]=true;
}
}
int ans=0;
for (long long i=l;i<=r;i++){//找区间内不是合数的就是质数
if (!hs[i-l]&&i!=0&&i!=1){//特判
// cout<<i<<endl;
ans++;
}
}
cout<<ans;
return 0;
}
大家比赛加油
附题目链接:素数密度 - 洛谷