思路:大区间素数筛
筛法用的kuangbin的模板
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN=1000010;
int prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2; i<=MAXN; i++)
{
if(!prime[i])prime[++prime[0]]=i;
for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
bool notprime[1000010];
int prime2[1000010];
void getPrime2(int L,int R)
{
memset(notprime,false,sizeof(notprime));
if(L<2)L=2;
for(int i=1; i<=prime[0]&&(long long)prime[i]*prime[i]<=R; i++)
{
int s=L/prime[i]+(L%prime[i]>0);
if(s==1)s=2;
for(int j=s; (long long)j*prime[i]<=R; j++)
if((long long)j*prime[i]>=L)
notprime[j*prime[i]-L]=true;
}
prime2[0]=0;
for(int i=0; i<=R-L; i++)
if(!notprime[i])
prime2[++prime2[0]]=i+L;
}
bool isPrime(ll num)
{
if(num == 1)
return false;
for(ll i = 2; i*i <= num; ++i)
if(num%i == 0)
return false;
return true;
}
int main()
{
getPrime();
int t,res,time = 0;
ll l,r;
cin >> t;
while(t--)
{
cin >> l >> r;
if(r <= MAXN)
{
int *e = lower_bound(prime+1,prime+1+prime[0],r);
int *s = lower_bound(prime+1,prime+1+prime[0],l);
if(*e > r) --e;
res = e-s+1;
cout << "Case " << ++time << ": " << res <<endl;
}
else
{
getPrime2(l,r);
cout << "Case " << ++time << ": " << prime2[0] << endl;
}
}
return 0;
}