这个是大数(1e9)的小区间(1e6)的素数个数
埃氏n ln n大约2e7 预测400ms
线性打表2~根号n for i:素数表 for j:l~r中i最小的倍数~n st[j]=true for 找出素数代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5,M=1e6+7;
int prime[N+5],cnt;
bool st[N+5];
int l,r,ans;
bool isprime[M+5];
void mTable(){
for(int i=2;i<=N;i++){
if(!st[i]) prime[cnt++]=i;
for(int j=0;prime[j]<=N/i;j++){
st[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
int main(int argc, char** argv) {
cin>>l>>r;
mTable();
for(int i=0;i<cnt;i++){
int p=prime[i];
for(long long j=max((long long)p<<1,1LL*(long long)ceil(1.0*l/p)*p);j<=r;j+=p){
isprime[j-l]=true;
}
}
for(int i=0;i<=r-l;i++)
if(!isprime[i]&&i+l>1) ans++;//注意以上埃氏不能筛1
cout<<ans<<endl;
return 0;
} 
京公网安备 11010502036488号