LightOJ 1197 Help Hanzo
題意:
給定[L,R],問[L,R]內有多少個素數
數據範圍L,R<=231,R-L<=1e5
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
int notprime[maxm];//sqrt(2^31)<4e7
int prime[maxm],cnt;
int mark[maxm];
void init(){
for(int i=2;i<maxm;i++){
if(!notprime[i]){
prime[cnt++]=i;
}
for(int j=0;j<cnt;j++){
if(prime[j]*i>=maxm)break;
notprime[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
void cal(int L,int R){
int len=R-L+1;
for(int i=0;i<len;i++)notprime[i]=0;
for(int i=0;i<cnt&&prime[i]<=R;i++){
int a=(L-1)/prime[i]+1;
if(a<=1)a=2;
int b=R/prime[i];
for(int j=a;j<=b;j++){
notprime[prime[i]*j-L]=1;
}
}
}
signed main(){
init();
int T;
cin>>T;
int cas=1;
while(T--){
int L,R;
cin>>L>>R;
if(L==1)L=2;
printf("Case %lld: ",cas++);
cal(L,R);
int ans=0;
int len=R-L+1;
for(int i=0;i<len;i++){
if(!notprime[i]){
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}