题意:区间质数个数
一看范围……虽然蛮大的,不过筛选法is ok
#include <cstdio>
#include <cstring>
using namespace std;
bool f[1000001],v[1000001]; int n,m;
int main(){
memset(f,1,sizeof(f));
for (int i=2;i<=1000000;i++){ //筛选素数
if (f[i]) {
v[i]=1;
for (int j=2;j<=1000000/i;j++) f[i*j]=0;}
} scanf("%d%d",&n,&m);
while (n--){int l,r;
scanf("%d%d",&l,&r);
if (l>0&&r<=m){
int ans=0;
for (int i=l;i<=r;i++) if (v[i]) ans++;//统计
printf("%d\n",ans);
} else printf("Crossing the line\n");
} return 0;
}
于是
欲哭无泪
后来发现前缀和可以免掉坑坑的统计
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
bool f[1000001]; int n,m,s[1000001];
int main(){
scanf("%d%d",&n,&m); f[1]=1;
for (int i=2;i<=(int)sqrt(m)+1;i++) if (!f[i]) for (int j=i*i;j<=m;j+=i) f[j]=1;
for (int i=1;i<=m;i++) s[i]=s[i-1]+1-f[i];//前缀和
while (n--){
int l,r;
scanf("%d%d",&l,&r);
if (l>0&&r<=m) printf("%d\n",s[r]-s[l-1]);
else printf("Crossing the line\n");
} return 0;
}