本题查询次数多范围也比较大,如果一个一个找会超时的,所以我们考虑用素数筛预处理出查询范围内所有的素数,然后运用前缀和加速查询速度。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000006;
int b[N] , j , s[N]; //b是素数数组,j是素数个数,s是前缀和数组
bool a[N]; //标记合数数组
int main(){
ios::sync_with_stdio(false);
cin.tie(0) , cout.tie(0);
//欧拉筛
for(int i = 2 ; i < N ; i ++){
if(!a[i]){
b[++ j] = i;
s[i] ++; //在筛出一个素数时进行前缀和标记
}
for(int q = 1 ; q <= j && i * b[q] < N ; q ++){
a[i * b[q]] = 1;
if(!(i % b[q]))
break;
}
}
a[1] = 1;
for(int i = 1 ; i < N ; i ++)
s[i] += s[i - 1];
int n;
cin >> n;
while(n --){
int l , r;
cin >> l >> r;
cout << s[r] - s[l - 1] << '\n';
}
return 0;
}

京公网安备 11010502036488号