解法:
预处理1,m的全部数,素数打上标记1,然后求前缀和。
#include <iostream>
#include <vector>
using namespace std;
#define endl '\n'
bool is_prime(int n) {
if (n < 2) return false;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) return false;
}
return true;
}
void get_prime(vector<int>& a) {
for (int i = 2; i < a.size(); i++) {
if (is_prime(i))
a[i] = 1;
}
}
void sum_num(vector<int>& a) {
for (int i = 1; i < a.size(); i++) {
a[i] += a[i - 1];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
vector<int> prime(m + 1, 0);
get_prime(prime);
sum_num(prime);
int l, r;
while (n--) {
cin >> l >> r;
cout << prime[r] - prime[l - 1] << endl;
}
return 0;
}