Skip to content

Commit 8dad62c

Browse files
committed
bitset sieve
1 parent d3790a7 commit 8dad62c

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

number/bs_sieve.hpp

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
#include <algorithm>
3+
#include <bitset>
4+
#include <cassert>
5+
#include <vector>
6+
7+
// CUT begin
8+
// Complexity: O(N log log N):
9+
// - N = 10^7: 8 / 6 MB, 62 / 81 ms (Codeforces / AtCoder, GCC C++17)
10+
// - N = 10^8: 61 / 44 MB, 1481 / 866 ms (Codeforces / AtCoder, GCC C++17)
11+
template <int LIMN> struct BitsetSieve {
12+
std::vector<int> primes;
13+
std::bitset<LIMN + 1> is_prime;
14+
const int maxN;
15+
BitsetSieve(int MAXN = LIMN) : maxN(MAXN) {
16+
is_prime.set();
17+
is_prime.reset(0), is_prime.reset(1);
18+
for (int p = 2; p <= MAXN; p++) {
19+
if (is_prime[p]) {
20+
primes.push_back(p);
21+
for (int j = p * 2; j <= MAXN; j += p) is_prime[j] = 0;
22+
}
23+
}
24+
}
25+
// Count primes less than or equal to x
26+
int prime_counting(int x) {
27+
assert(x <= maxN);
28+
return std::distance(primes.begin(), std::upper_bound(primes.begin(), primes.end(), x));
29+
}
30+
};

number/test/bs_sieve.test.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#define PROBLEM "https://judge.yosupo.jp/problem/enumerate_primes"
2+
#include "../bs_sieve.hpp"
3+
#include <iostream>
4+
#include <vector>
5+
using namespace std;
6+
7+
int main() {
8+
int N, A, B;
9+
cin >> N >> A >> B;
10+
BitsetSieve<500000001> sieve(N);
11+
vector<int> ret;
12+
for (unsigned i = 0; A * i + B < sieve.primes.size(); i++) ret.push_back(sieve.primes[A * i + B]);
13+
cout << sieve.primes.size() << ' ' << ret.size() << '\n';
14+
for (auto p : ret) cout << p << ' ';
15+
cout << '\n';
16+
}

0 commit comments

Comments
 (0)