#include <iostream>
#include <vector>
#include <bitset>
#include <math.h>
#include <algorithm>
#include <unordered_set>
using namespace std;
unsigned int L, R, ans = 0;
#define ull unsigned int
#define r(...) return __VA_ARGS__
std::vector<unsigned int> pri;
unordered_set<int> not_prime;
void fillPrism(const unsigned int &N) {
not_prime.insert(4);
not_prime.insert(6);
not_prime.insert(8);
not_prime.insert(9);
pri.push_back(2);
pri.push_back(3);
for (unsigned int i = 6; i <= N; i+=6) {
if (!not_prime.count(i-1)) {
pri.push_back(i-1);
}
for (unsigned int j : pri) {
if (((i-1) * j > N)) { break; }
not_prime.insert((i-1) * j);
if (((i-1) % j == 0)) { break; }
}
if (!not_prime.count(i + 1)) {
pri.push_back(i + 1);
}
if (i + 1 > N) { break; }
for (unsigned int j : pri) {
if (((i + 1) * j > N)) { break; }
not_prime.insert((i + 1) * j);
if (((i + 1) % j == 0)) { break; }
}
}
}
bool isPrime(const ull &n) {
if (n < 2 || (!(n & 1))) r(false);
for (ull i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
r(false);
}
}
r(true);
}
int main() {
cin >> L >> R;
fillPrism(R);
//L = 1;
//R = 100;
vector<unsigned int>::iterator LI = lower_bound(pri.begin(), pri.end(), L);
vector<unsigned int>::iterator RI = lower_bound(pri.begin(), pri.end(), R);
ans = distance(LI, RI);
if (isPrime(R))ans++;
cout << ans;
system("pause");
}
C++20 O2
会MLE
请教一下(题解?看不懂思密达)