大区间求素数个数筛法

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

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/88697317
今日推荐