求a-b范围内素数的个数
先打素数表,然后在范围内排除非素数就好了。
https://cn.vjudge.net/problem/LightOJ-1197
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define fin(a,n) for(int i=a;i<=n;i++)
const int maxn=1e6+10;
bool vis[maxn];
bool isprime[maxn];
int prime[maxn];
int num=0;
void init()
{
memset(isprime,true,sizeof(isprime));
isprime[1]=false;
fin(2,maxn)
{
if(isprime[i])
{
prime[++num]=i;
for(int j=i+i;j<=maxn;j+=i)
isprime[i]=false;
}
}
}
int main()
{ init();
int n;
scanf("%d",&n);
for(int cas=1;cas<=n;cas++)
{ memset(vis,true,sizeof(vis));
ll l,r;
scanf("%lld %lld",&l,&r);
for(int i=1;i<=num&&1ll*prime[i]*prime[i]<=r;i++)
{
for(ll j=l/prime[i]*prime[i];j<=r;j+=prime[i])
{
if(j>=l&&j>prime[i])vis[j-l]=false;
}
}
ll ans=r-l+1;
if(l==1)ans--;
fin(0,r-l)
if(!vis[i])ans--;
printf("Case %d: %d\n",cas,ans);
}
}