competitive-cpp

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub fiore57/competitive-cpp

:warning: math/prime-sieve.cpp

Back to top page

Code

template <typename T>
vector<pair<T, ll>> rle(const vector<T> &v) {
    vector<pair<T, ll>> ret;
    ret.reserve(v.size() / 2);
    for (const auto x : v) {
        if (ret.empty() || ret.back().first != x) {
            ret.emplace_back(x, 1);
        } else {
            ++ret.back().second;
        }
    }
    return ret;
}
struct primeSieve {
    ll n;
    vector<ll> primeFactor;
    vector<ll> primes;

    primeSieve(const ll n = 1) : n(n), primeFactor(n + 1, 0) {
        primeFactor[0] = primeFactor[1] = -1;
        for (ll i = 2; i <= n; ++i) {
            if (primeFactor[i])
                continue;
            primes.push_back(i);
            primeFactor[i] = i;
            for (ll j = i * i; j <= n; j += i) {
                if (!primeFactor[j])
                    primeFactor[j] = i;
            }
        }
    }
    bool isPrime(const ll x) const { return primeFactor[x] == x; }
    vector<ll> factorList(ll x) const {
        vector<ll> res;
        while (x != 1) {
            res.push_back(primeFactor[x]);
            x /= primeFactor[x];
        }
        return res;
    }
    vector<pair<ll, ll>> factor(const ll x) const { return rle(factorList(x)); }
};

#line 1 "math/prime-sieve.cpp"
template <typename T>
vector<pair<T, ll>> rle(const vector<T> &v) {
    vector<pair<T, ll>> ret;
    ret.reserve(v.size() / 2);
    for (const auto x : v) {
        if (ret.empty() || ret.back().first != x) {
            ret.emplace_back(x, 1);
        } else {
            ++ret.back().second;
        }
    }
    return ret;
}
struct primeSieve {
    ll n;
    vector<ll> primeFactor;
    vector<ll> primes;

    primeSieve(const ll n = 1) : n(n), primeFactor(n + 1, 0) {
        primeFactor[0] = primeFactor[1] = -1;
        for (ll i = 2; i <= n; ++i) {
            if (primeFactor[i])
                continue;
            primes.push_back(i);
            primeFactor[i] = i;
            for (ll j = i * i; j <= n; j += i) {
                if (!primeFactor[j])
                    primeFactor[j] = i;
            }
        }
    }
    bool isPrime(const ll x) const { return primeFactor[x] == x; }
    vector<ll> factorList(ll x) const {
        vector<ll> res;
        while (x != 1) {
            res.push_back(primeFactor[x]);
            x /= primeFactor[x];
        }
        return res;
    }
    vector<pair<ll, ll>> factor(const ll x) const { return rle(factorList(x)); }
};

Back to top page