3 条题解

  • 0
    @ 2026-2-14 16:49:47

    根据质数的性质:k≡1 ( mod  4),k∈Pk \equiv 1\ (\bmod\ 4), k \in \mathbb P(22 为特例,需特判)可得以下代码:

    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;
    }
    

    信息

    ID
    56
    时间
    3000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    21
    已通过
    4
    上传者