結果
問題 |
No.3118 Increment or Multiply
|
ユーザー |
|
提出日時 | 2025-04-19 09:49:30 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,292 bytes |
コンパイル時間 | 731 ms |
コンパイル使用メモリ | 82,320 KB |
実行使用メモリ | 76,768 KB |
最終ジャッジ日時 | 2025-04-19 09:49:36 |
合計ジャッジ時間 | 4,240 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 5 WA * 30 |
ソースコード
MOD = 998244353 INV2 = (MOD + 1) // 2 # 2 の逆元 def solve_one(N: int, A: int) -> int: # A=1 は特別扱い if A == 1: return (N % MOD) * ((N - 1) % MOD) % MOD * INV2 % MOD S1 = 0 # Σ m(K) S2 = 0 # Σ [K * A^{m(K)}] m = 0 powA = 1 L_m = N # floor(N / A^m) # m を 0 から順に増やしつつ、区間ごとにまとめて while L_m > 0: # 次の区間の上限 powA_next = powA * A L_next = N // powA_next if powA_next <= N else 0 cnt = L_m - L_next # この m に属する K の個数 # S1 に m * cnt を足す S1 = (S1 + m * (cnt % MOD)) % MOD # 区間 [L_next+1, L_m] の K の総和を求める # sum_K = (L_next+1 + L_m) * cnt // 2 を mod 上で sumK_mod = (( (L_next + 1 + L_m) % MOD ) * (cnt % MOD) % MOD) * INV2 % MOD # S2 に A^m * sumK S2 = (S2 + (powA % MOD) * sumK_mod) % MOD # 次へ m += 1 powA = powA_next L_m = L_next # 最終的に Σ f(K) = S1 + N^2 - S2 N2 = (N % MOD) * (N % MOD) % MOD return (S1 + N2 - S2) % MOD # 入力‐出力 import sys input = sys.stdin.readline T = int(input()) for _ in range(T): N, A = map(int, input().split()) print(solve_one(N, A))