#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
今日推荐
周排行