結果

問題 No.3118 Increment or Multiply
ユーザー koufu193
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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))
0