t个测试,找[l,r]内素数的个数
t<1e5, l,r<1e6
埃式筛法只能解决n<=1e7的问题
空间限制:visit[maxn+1],当maxn=1e7时约10MB,一般题目会限制65MB,n不能再大了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7;//定义空间大小,1e7约10MB
int prime[maxn+1];
bool visit[maxn+1];
int sum[maxn+1];
void E_sieve(int n)//埃式筛法
{
for(int i=0;i<=n;i++) visit[i]=false;
for(int i=2;i*i<=n;i++) // 边界i*i<=n(优化)
{
if(!visit[i])//i没被筛掉
{ //从i*i开始,前面的已经被更显得素数筛掉了(优化)
for(int j=i*i;j<=n;j+=i)
{
visit[j]=true;
}
}
}
//int k=0; //记录素数的个数
sum[1]=0;
sum[2]=1;
for(int i=3;i<=n;i++)
{
sum[i]=sum[i-1];
if(!visit[i])
{
//prime[k++]=i;//存下第k个素数是谁
sum[i]++;//到i有几个素数
}
}
//return k;
return ;
}
int main()
{
E_sieve(1e6);//打表,不然超时
int n;
cin>>n;
int l,r;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&l,&r);
printf("%d\n",sum[r]-sum[l-1]);
}
return 0;
}