結果
| 問題 |
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))