結果
問題 | No.42 貯金箱の溜息 |
ユーザー |
|
提出日時 | 2024-03-01 10:38:09 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,271 bytes |
コンパイル時間 | 273 ms |
コンパイル使用メモリ | 82,392 KB |
実行使用メモリ | 83,356 KB |
最終ジャッジ日時 | 2024-09-29 13:10:03 |
合計ジャッジ時間 | 12,965 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | TLE * 1 -- * 2 |
ソースコード
import sysimport mathimport bisectfrom heapq import heapify, heappop, heappushfrom collections import deque, defaultdict, Counterfrom functools import lru_cachefrom itertools import accumulate, combinations, permutations, productsys.setrecursionlimit(1000000)MOD = 10 ** 9 + 9MOD99 = 998244353input = lambda: sys.stdin.readline().strip()NI = lambda: int(input())NMI = lambda: map(int, input().split())NLI = lambda: list(NMI())SI = lambda: input()SMI = lambda: input().split()SLI = lambda: list(SMI())EI = lambda m: [NLI() for _ in range(m)]def mul(f, g, mod=998244353):"""愚直畳み込み"""fn = len(f)gn = len(g)res = [0] * (fn + gn - 1)for fi in range(fn):for gi in range(gn):res[fi+gi] += f[fi] * g[gi] % modres[fi+gi] %= modreturn resdef bostan_mori(P: list, Q: list, n: int, mod=998244353):"""d+1項間線形漸化式Qをもつ数列の第n項 modをもとめるA = P / QO(M(d)logN) M(d)はd次多項式同士の積の計算量(O(d^2 logN))http://q.c.titech.ac.jp/docs/progs/polynomial_division.html:param P: 母関数の分子を表すd項以下のlist:param Q: 母関数の分母をあらわすd+1項のlist(フィボナッチなら An - An-1 - An-2 = 0 なので Q=[1, -1, -1]):param n: 求めたい第n項(0-index):return: A[n]"""while n > 0:Qm = [-q if i % 2 else q for i, q in enumerate(Q)]V = mul(Q, Qm, mod)Q = V[::2]PQm = mul(P, Qm, mod)if n % 2 == 0:P = PQm[::2]n >>= 1else:P = PQm[1::2]n >>= 1return P[0]def mul_sparse(f: list, a, b, k, M):"""(a + b * x^k)倍 x^Mまで"""res = f.copy()for i in range(M+1):res[i] += f[i] * (a-1)if i+k <= M:res[i+k] += f[i] * bres[i] %= MODreturn resdef main():C = [1, 5, 10, 50, 100, 500]D = sum(C)Q = [0] * (D+1)Q[0] = 1for c in C:Q = mul_sparse(Q, 1, -1, c, D)T = NI()for _ in range(T):M = NI()P = [0] * DP[0] = 1X = bostan_mori(P, Q, M, MOD)print(X)if __name__ == "__main__":main()