結果
問題 | No.42 貯金箱の溜息 |
ユーザー |
👑 |
提出日時 | 2022-09-29 18:50:56 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 177 ms / 5,000 ms |
コード長 | 1,979 bytes |
コンパイル時間 | 276 ms |
コンパイル使用メモリ | 81,536 KB |
実行使用メモリ | 78,080 KB |
最終ジャッジ日時 | 2024-12-22 18:18:03 |
合計ジャッジ時間 | 1,616 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 |
ソースコード
MOD = 10 ** 9 + 9def lagrange_interpolation(X, Y, MOD):def modinv(a):b = MODu = 1v = 0while b:t = a // ba -= t * bu -= t * va, b = b, au, v = v, uu %= MODreturn uX = X[:]Y = Y[:]n = len(X) - 1for i in range(n + 1):t = 1for j in range(n + 1):if i != j:t *= X[i] - X[j]t %= MODY[i] *= modinv(t)Y[i] %= MODdp = [0] * (n + 2)dp[0] = -X[0]dp[1] = 1for i in range(1, n + 1):ndp = [0] * (n + 2)for j in range(n + 2):ndp[j] = -dp[j] * X[i]if j >= 1:ndp[j] += dp[j - 1]ndp[j] %= MODdp = ndpinv = [modinv(x) for x in X]coef = [0] * (n + 1)for i in range(n + 1):if Y[i] == 0:continueif X[i] == 0:for j in range(n + 1):coef[j] += dp[j + 1] * Y[i] % MODcoef[j] %= MODelse:pre = -dp[0] * inv[i] % MODcoef[0] += pre * Y[i] % MODif coef[0] >= MOD:coef[0] -= MODfor j in range(1, n + 1):nex = -(dp[j] - pre) * inv[i] % MODcoef[j] += nex * Y[i] % MODif coef[j] >= MOD:coef[j] -= MODpre = nexreturn coefdp = [0] * 3000dp[0] = 1for x in [1, 5, 10, 50, 100, 500]:for i in range(x, 3000):dp[i] += dp[i - x]dp[i] %= MODC = []for i in range(500):X = [j for j in range(6)]Y = [dp[j] for j in range(i, 3000, 500)]C.append(lagrange_interpolation(X, Y, MOD))for _ in range(int(input())):m = int(input())x = 1ans = 0mm = m // 500for c in C[m % 500]:ans += x * cans %= MODx *= mmx %= MODprint(ans)