Skip to content
Author: lllyouo
Date: 20250701
tag: 欧拉筛
link: https://www.luogu.com.cn/problem/P1835

问题描述

link

分析

参考代码

cpp
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
int primes[N], cnt = 0;
bool not_prime[N], v[N];

void get_primes(int n) {
    for (int i = 2; i <= n; i++) {
        if (!not_prime[i]) primes[++cnt] = i;

        for (int j = 1; j <= cnt && primes[j] <= n / i; j++) {
            not_prime[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }
    }
} 

int main() {
    long long l, r; cin >> l >> r;
    if (l == 1) l = 2;

    get_primes(sqrt(r));

    for (int i = 1; i <= cnt; i++) {        
        for (long long j = max(((l - 1) / primes[i] + 1) * primes[i], 2 * primes[i]); j <= r; j += primes[i]) {
            v[j - l + 1] = 1;
        }
    }
    int ans = 0;
    for (int i = 1; i <= r - l + 1; i++) if (!v[i]) ans++;
    cout << ans << endl;

    return 0;
}