- P56's solution
-
题解 P56
- @ 2026-2-14 16:49:47
根据质数的性质:( 为特例,需特判)可得以下代码:
AC code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> sieve(ll n) {
vector<bool> is_p(n + 1, true);
is_p[0] = is_p[1] = false;
for (ll i = 2; i * i <= n; ++i) {
if (is_p[i]) {
for (ll j = i * i; j <= n; j += i) {
is_p[j] = false;
}
}
}
vector<ll> res;
for (ll i = 2; i <= n; ++i) {
if (is_p[i]) {
res.push_back(i);
}
}
return res;
}
vector<bool> seg_sieve(ll L, ll R, const vector<ll>& primes) {
vector<bool> is_p(R - L + 1, true);
if (L == 1) {
is_p[0] = false;
}
for (ll p : primes) {
ll start = max(p * p, ((L + p - 1) / p) * p);
if (start > R) {
continue;
}
for (ll j = start; j <= R; j += p) {
is_p[j - L] = false;
}
}
return is_p;
}
int main() {
ll l, r;
cin >> l >> r;
if (r < 2) {
cout << 0 << endl;
return 0;
}
ll sqrt_r = sqrt(r);
vector<ll> primes = sieve(sqrt_r);
vector<bool> is_p = seg_sieve(l, r, primes);
int ans = 0;
for (ll i = 0; i <= r - l; ++i) {
if (is_p[i]) {
ll num = l + i;
if (num == 2) {
ans++;
} else if (num % 4 == 1) {
ans++;
}
}
}
cout << ans << endl;
return 0;
}