結果
問題 |
No.621 3 x N グリッド上のドミノの置き方の数
|
ユーザー |
![]() |
提出日時 | 2017-12-08 18:24:06 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 105 ms / 3,000 ms |
コード長 | 905 bytes |
コンパイル時間 | 99 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2024-11-29 19:40:16 |
合計ジャッジ時間 | 6,633 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 66 |
ソースコード
# OEIS 解です! mod = 10 ** 9 + 7 def mat_mul(l, r): ret = [[0] * 15 for _ in range(15)] for i in range(15): reti = ret[i] li = l[i] for k in range(15): lik = li[k] rk = r[k] for j in range(15): reti[j] += (lik * rk[j]) reti[j] %= mod return ret def mat_pow(A, m): B = [[0] * 15 for _ in range(15)] for i in range(15): B[i][i] = 1 while m: if m & 1: B = mat_mul(B, A) A = mat_mul(A, A) m >>= 1 return B def solve(n): anss = [0, 2, 5, 22, 75, 264, 941, 3286, 11623, 40960, 144267, 508812, 1792981, 6319994, 22277291, 78518760] if n <= 15: return anss[n] A = [[0] * 15 for _ in range(15)] A[0] = [1, 5, 11, 5, 14, 8, 3, 0, -5 + mod, -11 + mod, -1 + mod, 2, 0, 0, 1] for i in range(1, 15): A[i][i-1] = 1 A = mat_pow(A, n-15) ans = 0 for i in range(15): ans += A[0][i] * anss[15-i] ans %= mod return ans print(solve(int(input())))