diff --git a/atcoder/math.hpp b/atcoder/math.hpp index ec5bca5..0b6e366 100644 --- a/atcoder/math.hpp +++ b/atcoder/math.hpp @@ -82,7 +82,7 @@ std::pair crt(const std::vector& r, long long floor_sum(long long n, long long m, long long a, long long b) { long long ans = 0; if (a >= m) { - ans += (n - 1) * n * (a / m) / 2; + ans += (n - 1) * n / 2 * (a / m); a %= m; } if (b >= m) { @@ -90,10 +90,9 @@ long long floor_sum(long long n, long long m, long long a, long long b) { b %= m; } - long long y_max = (a * n + b) / m, x_max = (y_max * m - b); - if (y_max == 0) return ans; - ans += (n - (x_max + a - 1) / a) * y_max; - ans += floor_sum(y_max, a, m, (a - x_max % a) % a); + long long y_max = a * n + b; + if (y_max < m) return ans; + ans += floor_sum(y_max / m, a, m, y_max % m); return ans; }