@@ -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