题目链接:https://vjudge.net/problem/LightOJ-1197
题意:给两个数a,b,求a,b之间有几个素数。
思路:首先可以用线性筛筛选出1e6范围内的素数,然后如果b<1e6的话,直接扫一边就行记录答案就行;否则,我没可以用已经筛选出来的1e6范围内的素数,用埃氏筛法的思想把a->b范围内的非素数全部标记出来,之后直接扫一遍记录答案就行
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
const LL maxn=1e6+7;
LL prime[maxn];
bool vis[maxn],vis1[maxn];
void getPrime()
{
vis[1]=1;
for(LL i=2;i<=maxn;i++)
{
if(!vis[i])
{
prime[++prime[0]]=i;
for(LL j=i+i;j<=maxn;j+=i)
{
vis[j]=1;
}
}
}
}
int main()
{
getPrime();
int T;
cin>>T;
LL cas=1;
while(T--)
{
LL a,b;
cin>>a>>b;
LL cnt=0;
if(b<=maxn)
{
for(LL i=a;i<=b;i++)
{
if(!vis[i]) cnt++;
}
// cout<<"cnt = "<<cnt<<endl;
}
else
{
memset(vis1,0,sizeof(vis1));
for(LL i=1;i<=prime[0]&&prime[i]<=b;i++)
{
LL p=a/prime[i];
if(p*prime[i]<a) p++;
for(LL j=p*prime[i];j<=b;j+=prime[i])
{
vis1[j-a]=1;
}
}
for(LL i=a;i<=b;i++)
{
if(!vis1[i-a]) cnt++;
}
}
cout<<"Case "<<cas++<<": "<<cnt<<endl;
}
return 0;
}