添加链接描述虽然求素数大家已经很熟了,但是此题目的数据量很大,达到了1000000,而且询问次数也很多,所以我们应该·冷静分析,此题让我们多次求区间内的素数的个数,怎么把多次去掉了?
我们最好是开一个数组,走一遍,把i之前有的素数存入a[i]中,这样区间[l,r]之间的素数就是a[r]-a[l-1],然后我们应该考虑的是如何确定a[i]了,当然是较为快速的筛选法咯。
附上代码,我是不会告诉你,我看过大佬的代码的哦
#include<bits/stdc++.h>
using namespace std;
int a[1000005],f[1000005];
void zhi(int n)
{
f[1]=1;
for(int i=2;i<=1000;i++)
if(!f[i])
for(int j=i*i;j<=n;j+=i) f[j]=1;
for(int i=1;i<=n;i++) a[i]=a[i-1]+(f[i]^1);
}
int main()
{
int n,m,l,r;
scanf("%d%d",&n,&m);
zhi(m);
while(n--)
{
scanf("%d%d",&l,&r);
if(l<1||r>m) printf("Crossing the line\n");
else printf("%d\n",a[r]-a[l-1]);
}
return 0;
}