Skip to content

Commit d936404

Browse files
committed
combine (x, y) and (y, x)
1 parent 4c9e0c2 commit d936404

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

cp-algo/number_theory/dirichlet.hpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,23 @@ namespace cp_algo::math {
2828
};
2929

3030
auto call = [&](interval x, interval y, interval z) {
31-
auto sum_x = F[x.hi] - F[x.lo - 1];
32-
decltype(sum_x) sum_y;
31+
auto Fx = F[x.hi] - F[x.lo - 1];
32+
auto Fy = F[y.hi] - F[y.lo - 1];
33+
decltype(Fx) Gx, Gy, t;
3334
if constexpr (mode == standard) {
34-
sum_y = G[y.hi] - G[y.lo - 1];
35+
Gy = G[y.hi] - G[y.lo - 1];
36+
Gx = G[x.hi] - G[x.lo - 1];
3537
} else {
36-
sum_y = G[y.lo - 1] - G[y.hi];
38+
Gy = G[y.lo - 1] - G[y.hi];
39+
Gx = G[x.lo - 1] - G[x.hi];
40+
}
41+
if(x == y) [[unlikely]] {
42+
t = Fx * Gy;
43+
} else {
44+
t = Fx * Gy + Fy * Gx;
3745
}
38-
auto t = sum_x * sum_y;
3946
H[z.lo] += t;
40-
if (z.hi < num_floors) {
47+
if (z.hi < num_floors) {
4148
H[z.hi + 1] -= t;
4249
}
4350
};
@@ -51,7 +58,6 @@ namespace cp_algo::math {
5158
int y_hi_ord = to_ord(n / (x * z));
5259
if (y_hi_ord < y_lo_ord) break;
5360
call({x, x}, {y_lo_ord, y_hi_ord}, {k, k});
54-
call({y_lo_ord, y_hi_ord}, {x, x}, {k, k});
5561
}
5662
}
5763

@@ -65,7 +71,6 @@ namespace cp_algo::math {
6571
int z_hi_ord = to_ord(n / x);
6672
if (z_hi_ord < z_lo_ord) break;
6773
call({x, x}, {y, y}, {z_lo_ord, z_hi_ord});
68-
call({y, y}, {x, x}, {z_lo_ord, z_hi_ord});
6974
}
7075
int z_lo_ord = to_ord(1LL * x * x);
7176
call({x, x}, {x, x}, {z_lo_ord, num_floors});

0 commit comments

Comments
 (0)