本题查询次数多范围也比较大,如果一个一个找会超时的,所以我们考虑用素数筛预处理出查询范围内所有的素数,然后运用前缀和加速查询速度。
#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; }