結果
| 問題 |
No.41 貯金箱の溜息(EASY)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-08-03 22:54:08 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 234 ms / 5,000 ms |
| コード長 | 1,159 bytes |
| コンパイル時間 | 193 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 18,488 KB |
| 最終ジャッジ日時 | 2024-07-18 01:09:49 |
| 合計ジャッジ時間 | 1,423 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 |
ソースコード
def preprocess():
'''1..9 の硬貨を使って、1..N を表す方法が何通りあるかを返す。
dp[k][n]: 1..k円の硬貨を使って、n 円を表すパターン数 とすると、
dp[k][0] = 1
dp[k][j] = dp[j][j] (if k > j)
dp[1][n] = 1
dp[2][n] = sum(dp[1][n-2*i] for i in range(n//2))
= dp[2][n-2] + dp[1][n]
= dp[2][n-2] + 1
dp[3][n] = sum(dp[2][n-3*i] for i in range(n//3))
= dp[3][n-3] + dp[2][n]
dp[k][n] = dp[k][n-k] + dp[k-1][n]
'''
M = 10**10
N = M // 111111
mod = 10**9 + 9
dp = [1] * (N + 1)
for k in range(2, 10):
new_dp = [0] * (N + 1)
for i in range(k):
new_dp[i] = dp[i]
for i in range(k, N + 1):
new_dp[i] = (new_dp[i - k] + dp[i]) % mod
dp = new_dp
cumdp = []
tmp = 0
for dpi in dp:
tmp += dpi
tmp %= mod
cumdp.append(tmp)
return cumdp
def solve(m, dp):
n = m // 111111
return dp[n]
if __name__ == '__main__':
dp = preprocess()
T = int(input())
for t in range(T):
m = int(input())
print(solve(m, dp))