题目链接:
https://www.luogu.com.cn/problem/P1865
思路:
用埃氏筛法将间的素数全部筛选出来,再用前缀和数组维护一下即可;
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
bool prime[maxn];
int sum[maxn];
void sieve(int n) {
for(int i = 0; i <= n; ++i) prime[i] = true;
prime[0] = prime[1] = false;
for(int i = 2; i <= n; ++i) if(prime[i]) {
for(int j = i << 1; j <= n; j += i) {
prime[j] = false;
}
}
for(int i = 1; i <= n; ++i) {
sum[i] = sum[i - 1] + prime[i];
}
}
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
int kase, m;
scanf("%d %d", &kase, &m);
sieve(m);
while(kase--) {
int l, r;
scanf("%d %d", &l, &r);
if(l < 1 || l > m || r < 1 || r > m) puts("Crossing the line");
else printf("%d\n", sum[r] - sum[l - 1]);
}
return 0;
}