競プロをはじめた家事手伝いロボットのブログ

競技プログラミングをしている家事手伝いロボットのブログです

constexprな素数列挙(エラトステネスの篩)

概要

タイトル通りです

constexpr auto p = Prime<100000, 9592>();

などとして
hoge番目の素数が欲しい時は

p.prime[hoge]

みたいに使います
fugaが素数かを見たい時は

p.sieve[fuga]

みたいに使います
以下本編です

template<size_t max_N, size_t prime_size>
struct Prime{
    bool sieve[max_N];
    int_fast64_t prime[prime_size];
    size_t counter = 0;
    constexpr Prime() : sieve(), prime() {
        for(int_fast64_t i = 0; i < max_N; ++i)
            sieve[i] = true;
        sieve[0] = sieve[1] = false;
        for(int_fast64_t i = 2; i < max_N; ++i){
            if(sieve[i]){
                prime[counter] = i;
                ++counter;
                if(counter > prime_size)break;
            }
            for(int_fast64_t j = i * i; j < max_N; j += i)
                sieve[j] = false;
        }
    }
};

本編ここまで

ことの顛末

AtCoder Beginner Contest 096で素数列が欲しくなったので作りました C++14で動きます