题解:本题主要考察前缀和,判断质数。判断质数很简单就不说了,关键在于数据很大,所以用前缀和来表示区间质数和。
代码如下:
#include<iostream>
using namespace std;
int n,m,l,r,i,j,ans=0;
int f[99999999];
bool v[1111111111];
void prime()
{
v[1]=1;
for(i=2;i*i<=m;i++)
{
if(v[i]==0)
for(j=i*i;j<=m;j+=i)v[j]=1;//判断质数
}
for(i=2;i<=m;i++)
{
f[i]=f[i-1];
if(v[i]==0)f[i]++;//前缀和
}
}
int main()
{
cin>>n>>m;
prime();
for(i=1;i<=n;i++)
{
cin>>l>>r;
if(l<1||r>m)cout<<"Crossing the line"<<endl;
else
{
ans=f[r]-f[l-1];//注意此处,才能让询问空间变为l到r。
cout<<ans<<endl;
}
}
return 0;
}