結果
問題 | No.2891 Mint |
ユーザー |
|
提出日時 | 2024-10-06 23:06:36 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 138 ms / 2,000 ms |
コード長 | 1,895 bytes |
コンパイル時間 | 154 ms |
コンパイル使用メモリ | 82,484 KB |
実行使用メモリ | 61,824 KB |
最終ジャッジ日時 | 2024-10-06 23:06:43 |
合計ジャッジ時間 | 5,743 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 54 |
ソースコード
## https://yukicoder.me/problems/no/1385import mathMOD = 998244353inv2 = pow(2, MOD - 2, MOD)def sum_k(n):ans = (n * (n + 1)) % MODans *= inv2ans %= MODreturn ansdef solve_normal(N, M):answer = 0for k in range(1, N + 1):n = (M % k)answer += nanswer %= MODreturn answerdef solve_true(N, M):sqrt_n = int(math.sqrt(M))# 前半は正規に解くanswer1 = 0for k in range(1, min(N, sqrt_n) + 1):n = (M % k)answer1 += nanswer1 %= MOD# 後半は商に注目start = Nanswer2 = 0for q in range(sqrt_n + 1):end = M // (q + 1)end = max(sqrt_n, end)if start > end:# [start, end)が商qの範囲if q == 0:n1 = (N - M) % MODans = (n1 * M) % MODanswer2 += ansanswer2 %= MODelse:init_s = M // qinit_r = M % qa1 = (-q * sum_k(start)) % MODb1 = (init_s * q) % MODb1 += init_rb1 %= MODb1 *= startb1 %= MODa2 = (-q * sum_k(end)) % MODb2 = (init_s * q) % MODb2 += init_rb2 %= MODb2 *= endb2 %= MODans = (a1 -a2) % MODans += b1ans %= MODans -= b2ans %= MODanswer2 += ansanswer2 %= MODstart = endif end == sqrt_n:breakreturn (answer1 + answer2) % MODdef main():N, M = map(int, input().split())# ans1 = solve_normal(N, M)ans2 = solve_true(N, M)# print(ans1)print(ans2)if __name__ == "__main__":main()