思路:
用素数筛处理出所有素数,再对于每次查询进行判断。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxm 1000000
int m;
int ispr[maxm+5]={0};
void slv(){
for(int i=2;i<=m;i++) ispr[i]=true;
for(int i=2;i<=m;i++){
if(ispr[i]) {
for(int j=i*2;j<=m;j+=i){
ispr[j]=false;
}
}
}
for(int i=2;i<=m;i++) {
ispr[i]+=ispr[i-1];
}
}
int main(){
int t;
scanf("%d%d",&t,&m);
slv();
while(t--){
int l,r;
scanf("%d %d",&l,&r);
if(l<=0||r<=0||l>m||r>m) printf("Crossing the line\n");
else printf("%d\n",ispr[r]-ispr[l-1]);
}
return 0;
}