Skip to content

Commit 15de8f9

Browse files
committed
Added optimiztions to segmented sieve
1 parent f570442 commit 15de8f9

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

data_structures/li_chao.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ using ll = long long;
66

77
int const maxn = 101010;
88
ll const maxm = 1e9;
9-
ll const inf = 0x3f3f3f3f3f3f3f3f;
109

1110
struct Fc {
1211
ll a, b;
@@ -48,7 +47,7 @@ ll get(Node *t, ll l, ll r, ll x) {
4847
return min(t->fn.eval(x), get(t->l, l, m, x));
4948
else if (x > m and t->r)
5049
return min(t->fn.eval(x), get(t->r, m+1, r, x));
51-
50+
5251
return t->fn.eval(x);
5352
}
5453

@@ -62,7 +61,7 @@ int main()
6261
cin >> n;
6362

6463
for (int i = 1; i <= n; i++) cin >> a[i];
65-
for (int i = 1; i <= n; i++) cin >> b[i], dp[i] = inf;
64+
for (int i = 1; i <= n; i++) cin >> b[i];
6665

6766
Node *root = new Node{{b[1], 0}};
6867
dp[1] = b[1];

math/segmented_sieve.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include <bits/stdc++.h>
22

3+
#pragma GCC optimize("O3","unroll-loops")
4+
35
using namespace std;
46

57
uint32_t const sieve_size = 1<<17;

math/segmented_sieve_bit.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <bits/stdc++.h>
2+
3+
#pragma GCC optimize("O3","unroll-loops")
4+
5+
using namespace std;
6+
7+
uint32_t const sieve_size = 1<<20;
8+
9+
vector<uint64_t> solve(uint64_t l, uint64_t r) {
10+
static const int64_t unset_bit[16] = {
11+
~(1 << 0), ~(1 << 0),
12+
~(1 << 1), ~(1 << 1),
13+
~(1 << 2), ~(1 << 2),
14+
~(1 << 3), ~(1 << 3),
15+
~(1 << 4), ~(1 << 4),
16+
~(1 << 5), ~(1 << 5),
17+
~(1 << 6), ~(1 << 6),
18+
~(1 << 7), ~(1 << 7)
19+
};
20+
21+
uint64_t i = 3, s = 3, n = std::max(l|1, 3ul);
22+
uint64_t sqt = std::sqrt(r);
23+
24+
vector<char> sieve(sieve_size), is_prime(sqt+1, true);
25+
vector<uint64_t> primes, mult;
26+
27+
vector<uint64_t> result;
28+
29+
if (l <= 2 and r > 2) result.push_back(2);
30+
31+
for (; i*i < l; i += 2)
32+
if (is_prime[i])
33+
for (uint64_t j = i*i; j < sqt; j += 2*i)
34+
is_prime[j] = false;
35+
36+
for (; s*s < l; s += 2) {
37+
if (is_prime[s]) {
38+
primes.push_back(s);
39+
uint64_t nxt = ((l-1)/s+1)*s;
40+
if (nxt == s) nxt += s;
41+
if (nxt%2 == 0) nxt += s;
42+
mult.push_back(nxt-l);
43+
}
44+
}
45+
46+
for (uint64_t low = l; low < r; low += sieve_size) {
47+
fill(sieve.begin(), sieve.end(), 0xff);
48+
uint64_t high = min(r, low+sieve_size);
49+
50+
for (; i*i < high; i += 2)
51+
if (is_prime[i])
52+
for (uint64_t j = i*i; j < sqt; j += 2*i)
53+
is_prime[j] = false;
54+
55+
for (; s*s < high; s += 2) {
56+
if (is_prime[s]) {
57+
primes.push_back(s);
58+
mult.push_back(s*s - low);
59+
}
60+
}
61+
62+
for (size_t j = 0; j < primes.size(); j++) {
63+
uint64_t k = mult[j];
64+
for (uint64_t prime = primes[j]*2; k < sieve_size; k += prime)
65+
sieve[k>>4] &= unset_bit[k&15];
66+
mult[j] = k-sieve_size;
67+
}
68+
69+
for (; n < high; n += 2)
70+
if (sieve[(n-low)>>4]&~unset_bit[(n-low)&15])
71+
result.push_back(n);
72+
}
73+
74+
return result;
75+
}
76+
77+
int main() {
78+
uint64_t l, r;
79+
cin >> l >> r;
80+
81+
auto ans = solve(l, r+1);
82+
83+
for (auto p : ans) cout << p << "\n";
84+
}

0 commit comments

Comments
 (0)