-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsieve_segmented.cpp
More file actions
47 lines (39 loc) · 1.17 KB
/
Copy pathsieve_segmented.cpp
File metadata and controls
47 lines (39 loc) · 1.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
-> Segmented Sieve
-> ref: https://cp-algorithms.com/algebra/sieve-of-eratosthenes.html#segmented-sieve
-> better in terms of memory complexity: O(sqrt(n) + S)
*/
vector<int> primes;
void sieve_segmented() {
int n = N;
const int S = 5e4;
primes.clear();
vector<int> primes_nsqrt;
int nsqrt = sqrt(n);
vector<char> is_prime(nsqrt + 1, true);
for (int i = 2; i <= nsqrt; ++i) {
if (is_prime[i]) {
primes_nqrt.pb(i);
for (int j = i * i; j <= nsqrt; j += i)
is_prime[j] = false;
}
}
int result = 0;
vector<char> block(S);
for (int k = 0; k * S <= n; ++k) {
fill(all(block), true);
int start = k * S;
for (int &p : primes_nqrt) {
int start_ind = (start + p - 1) / p;
int j = max(start_ind, p) * p - start;
for (; j < S; j += p)
block[j] = false;
}
if (k == 0)
block[0] = block[1] = false;
for (int i = 0; i < S && start + i <= n; ++i) {
if (block[i])
primes.pb(start + i);
}
}
}