結果
問題 | No.41 貯金箱の溜息(EASY) |
ユーザー | rpy3cpp |
提出日時 | 2015-08-03 22:54:08 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 228 ms
18,488 KB |
testcase_01 | AC | 234 ms
18,488 KB |
ソースコード
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))