noip模拟测 小X的素数
求[l, r]中质因数个数小于等于2的个数
(大概是正确的程序)
(特技线性筛可以顺便筛出每个数字的质因数个数)
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> #include <set> #include <vector> using namespace std; const int N = 1e7 + 10; vector<int> prime; bool vis[N]; int cnt[N], q; void oura(int n) { for(int i = 2 ; i <= n ; i ++) { if(cnt[i] == 0) { prime.push_back(i); cnt[i] = 1; } for(int j = 0 ; j < prime.size() ; j ++) { if(prime[j] * i > n) break; cnt[i * prime[j]] = cnt[i] + 1; if(i % prime[j] == 0) break; } } } int main() { scanf("%d", &q); oura(1e7); for(int i = 1 ; i <= 1e7 ; i ++) { cnt[i] = cnt[i - 1] + (cnt[i] <= 2); } for(int i = 1, l, r ; i <= q ; i ++) { scanf("%d%d", &l, &r); printf("%d\n", cnt[r] - cnt[l - 1]); } }