素數區間篩

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章