模板

struct Primes {

    std::vector<int> pr, p;
    size_t sz;

    void init(int n) {
        p.resize(n + 1, 0); sz = 0; p[1] = 1;
        for (int i = 2; i <= n; i++) {
            if (!p[i]) {
                p[i] = i; pr.emplace_back(i); sz++;
            }
            for (int j = 0; j < sz && 1LL * pr[j] * i <= n; j++) {
                p[i * pr[j]] = pr[j];
                if (p[i] == p[j]) break;
            }
        }
    }

    size_t size() const {
        return sz;
    }

    int& operator[](size_t i) {
        if (i >= sz) return pr[0];
        return pr[i];
    }
};

使用

初始化

使用init(n)来进行 \(1\)\(n\) 的线性筛

访问数据

重构了[], 可以通过下标访问, 下标从 \(0\) 开始,范围\([0, sz)\)

pr 存储素数。

p 存储每个数的最小素因子。

其他

P3383 【模板】线性筛素数

OI-wiki 筛法