-
题目大意:就原题的意思,求某个区间内素数和个数。
-
Tag:
- 前缀和
- 线性筛法
- 思路:
求某个区间内的和,第一个想到的是前缀和。与此同时,题目要求的是素数的个数,那么我们可以将线性筛法和前缀和同时进行。
如果当前这个数是素数,那么我们将从第一个素数到当前这个下标数区间内的素数个数和加一,即s[i] = s[i- 1] + 1。
否则与上一个数保持一致,即s[i] = s[i - 1]
- Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n, m, l, r;
bool isprime[N];
int s[N];//从第一个素数到当前这个下标数的区间内的素数个数和
void fun() {
memset(isprime, true, sizeof(isprime));
isprime[1] = false;
for(int i = 2; i <= m; i++) {
if(isprime[i]) {
for(int j = i * 2; j <= m; j += i)
isprime[j] = false;
s[i] = s[i - 1] + 1;//个数加一
}
else s[i] = s[i - 1];//个数不变
}
}
int main() {
scanf("%d%d", &n, &m);
fun();
for(int i = 0; i < n; i++) {
scanf("%d%d", &l, &r);
if(l < 1 || r > m) {//还有边界的哦
printf("Crossing the line\n");
continue;
}
printf("%d\n", s[r] - s[l - 1]);
}
return 0;
}