先预处理 1 1 1 至 1000000 1000000 1000000 的质数,并用前缀和记记录前 i i i 个数字中质数的个数 f i f_i fi ,在输入 l , r l,r l,r 时直接输出 f r − f l − 1 f_r-f_{l-1} fr−fl−1 即可。
#include<bits/stdc++.h>
using namespace std;
namespace Solve
{
int v[1000006],p[1000006];
int f[1000006];
void find_prime()
{
int cnt=0;
for(int i=2; i<=1000000; i++)
{
if(!v[i])
{
p[++cnt]=i;
f[i]++;
}
for(int j=1; p[j]*i<=1000000&&j<=cnt; j++)
{
v[p[j]*i]=1;
if(!(i%p[j]))
break;
}
f[i]+=f[i-1];
}
}
int main()
{
find_prime();
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
int l,r;
cin>>l>>r;
if(l<1||r>m)printf("Crossing the line\n");
else printf("%d\n",f[r]-f[l-1]);
}
}
}
int main()
{
Solve::main();
}