From caa37de30fb5bad59b5711a0522eccfaacdce98d Mon Sep 17 00:00:00 2001 From: yenru0 Date: Mon, 16 Mar 2026 21:59:28 +0900 Subject: [PATCH] add 24518.cpp --- storage/zeta/cpp/24518.cpp | 91 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 storage/zeta/cpp/24518.cpp diff --git a/storage/zeta/cpp/24518.cpp b/storage/zeta/cpp/24518.cpp new file mode 100644 index 0000000..f3233bf --- /dev/null +++ b/storage/zeta/cpp/24518.cpp @@ -0,0 +1,91 @@ +#include +#include +#include + +#define let auto +#define fn auto +#define usize size_t + +using namespace std; + +const usize MOD = 1'000'000'007; + +fn fastio() { + ios::sync_with_stdio(false); + cin.tie(nullptr); +} + +fn well_known_sum_draft(usize n, usize m) -> usize { + let res = (usize) 0; + for (usize i = 1; i <= n; i++) { + res += (n / i) * (i % m); + res %= MOD; + } + return res; +} + +fn well_known_subarr_sum(usize d, usize lo, usize hi /* exclusive */, usize m) -> usize { + let res = (usize) 0; + + let lo_margin = lo % m; + let hi_margin = hi % m; + if (lo / m == hi / m) { + res += ((hi_margin * (hi_margin - 1) / 2) - (lo_margin * (lo_margin - 1) / 2)) * d; + res %= MOD; + return res; + } + + res += (hi_margin * (hi_margin - 1) / 2) * d; + res %= MOD; + + res += (m * (m - 1) / 2 - lo_margin * (lo_margin - 1) / 2) * d; + res %= MOD; + + let d_cycle = (d * (m * (m - 1) / 2) % MOD) % MOD; + let cycle_cnt = (hi - lo - (hi_margin + m - lo_margin)) / m; + res += cycle_cnt * d_cycle; + res %= MOD; + return res; +} + +fn well_known_sum(usize n, usize m) -> usize { + let res = (usize) 0; + let steps = vector(); + steps.push_back(n + 1); + for (usize i = 2; i <= (usize) pow(n, 0.5) + 1; i++) { + steps.push_back(n / i + 1); + } + + for (usize i = 1; i < (usize) pow(n, 0.5); i++) { + res += (n / i) * (i % m); + res %= MOD; + } + + let step_size = steps.size(); + for (usize i = 0; i < step_size - 1; i++) { + let temp = well_known_subarr_sum(i + 1, steps[i + 1], steps[i], m); + res += temp; + res %= MOD; + } + + return res; +} + +fn main() -> int { + fastio(); + usize n; + usize m; + + cin >> n; + cin >> m; + + if (n <= 10) { + cout << well_known_sum_draft(n, m) << endl; + } else if (m == 1) { + cout << 0 << endl; + } else { + cout << well_known_sum_draft(n, m) << endl; + cout << well_known_sum(n, m) << endl; + } + return 0; +} \ No newline at end of file