https://vjudge.net/contest/276155#problem/M
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int tot=0,ans[N/10];
bool vis[N],v[N];
void primer()
{
memset(vis,true,sizeof(vis));
for(int i=2;i<N;++i)
{
if(vis[i]) ans[++tot]=i;
for(int j=1;(j<=tot)&&(i*ans[j]<N);++j)
{
vis[i*ans[j]]=false;
if(i%ans[j]==0) break;
}
}
}
int main()
{
primer();
//for(int i = 1;i<=10;++i)
//cout<<ans[i]<<endl;
int t,a,b,cas=1;
scanf("%d",&t);
while(t--)
{
int bns=0,max,min;
scanf("%d%d",&a,&b);
if(b<N)
{
min=lower_bound(ans+1,ans+tot+1,a)-ans;
max=upper_bound(ans+1,ans+tot+1,b)-ans;
bns=max-min;
}
else{
memset(v,true,sizeof(v));
for(int i=1;(i<=tot)&&(ans[i]<a);++i)
{
ll k=a/ans[i];
if(a%ans[i]) k++;
for(ll j=k*ans[i];j<=b;j+=ans[i])
v[j-a]=false;
}
for(int k=0;k<=b-a;++k)
if(v[k]) bns++;
}
printf("Case %d: %d\n",cas++,bns);
}
}