大區間求素數個數篩法

 

#include<bits/stdc++.h>
using namespace std;
#define LL long long

#define MAX_L 1000007
#define MAX_SORT_B 1000007

bool is_prime[MAX_L];
bool is_prime_small[MAX_SORT_B];

void find_s(LL a,LL b)
{
    for(int i=0; (LL)i*i < b; i++)is_prime_small[i]=true;
    for(int i=0; i<b-a; i++)is_prime[i]=true;
    for(int i=2; (LL)i * i<b; i++)
    {
        if(is_prime_small[i])
        {
            for(int j=2*i; (LL)j * j < b; j += i)
            {
                is_prime_small[j]=false;//篩[2,sqrt(b))
            }
            for(LL j=max(2LL, (a+i-1)/i)*i ; j<b; j+=i) //(a+i-1)/i爲[a,b)區間內的第一個數至少爲i的多少倍.
            {
                is_prime[j - a] =false;//篩[a,b)
            }
        }
    }
}

int main()
{
    long long a,b;
    int t;
    cin>>t;
    int f=0;
    while(t--)
    {
        scanf("%lld %lld",&a,&b);
        b++;
        find_s(a,b);
        int cnt=0;
        for(int j=0; j<b-a; j++)
        {
            if(is_prime[j])cnt++;
        }
        if(a==1)cnt--;
        printf("Case %d: %d\n",++f,cnt);//±ð
        //printf("%d\n",cnt);
    }
    return 0;
}

 

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