結果
問題 |
No.3118 Increment or Multiply
|
ユーザー |
|
提出日時 | 2025-04-19 19:36:54 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 543 ms / 2,000 ms |
コード長 | 1,566 bytes |
コンパイル時間 | 657 ms |
コンパイル使用メモリ | 12,288 KB |
実行使用メモリ | 12,464 KB |
最終ジャッジ日時 | 2025-04-19 19:37:04 |
合計ジャッジ時間 | 8,916 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 35 |
ソースコード
import sys def solve_case(N, A, mod, inv2): # Case A = 1: f(K) = N - K, sum = N*(N-1)//2 if A == 1: n_mod = N % mod return n_mod * ((n_mod - 1 + mod) % mod) % mod * inv2 % mod # Build sequence N_i: N_0 = N, N_{i+1} = floor(N_i / A), until N_i = 0 Ni = [N] while Ni[-1] > 0: Ni.append(Ni[-1] // A) # Precompute prefix sums of remainders R[i] = sum_{k=0..i-1} (Ni[k] mod A) M = len(Ni) - 1 # Ni[M] = 0 R = [0] * (M + 1) for i in range(1, M + 1): R[i] = R[i-1] + (Ni[i-1] % A) R_mod = [r % mod for r in R] result = 0 # Helper to compute s(x) = x*(x+1)//2 mod def sum_upto(x): x_mod = x % mod return x_mod * ((x + 1) % mod) % mod * inv2 % mod for i in range(M): n_i = Ni[i] n_next = Ni[i+1] length = n_i - n_next # number of K in (N_{i+1}, N_i] # term1 = length * (R[i] + i + N_i) term1 = length % mod * ((R_mod[i] + i) % mod + (n_i % mod)) % mod # term2 = sum_{K=n_next+1..n_i} K = s(n_i) - s(n_next) term2 = (sum_upto(n_i) - sum_upto(n_next)) % mod result = (result + term1 - term2) % mod return result def main(): input_data = sys.stdin.read().split() t = int(input_data[0]) mod = 998244353 inv2 = pow(2, mod-2, mod) out = [] idx = 1 for _ in range(t): N = int(input_data[idx]); A = int(input_data[idx+1]) idx += 2 out.append(str(solve_case(N, A, mod, inv2))) sys.stdout.write("\n".join(out)) if __name__ == '__main__': main()