結果
問題 | No.621 3 x N グリッド上のドミノの置き方の数 |
ユーザー |
👑 |
提出日時 | 2022-10-18 23:50:12 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 241 ms / 3,000 ms |
コード長 | 1,534 bytes |
コンパイル時間 | 192 ms |
コンパイル使用メモリ | 81,976 KB |
実行使用メモリ | 76,660 KB |
最終ジャッジ日時 | 2024-06-29 05:43:56 |
合計ジャッジ時間 | 14,243 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 66 |
ソースコード
MOD = 10 ** 9 + 7def matpow(A, B, w):l = len(A)while w:if w & 1:C = [0] * lfor i in range(l):for j in range(l):C[i] += A[i][j] * B[j]C[i] %= MODB = CC = [[0] * l for _ in range(l)]for i in range(l):for j in range(l):for k in range(l):C[i][j] += A[i][k] * A[k][j]C[i][j] %= MODA = Cw >>= 1return Bn = int(input())m = 64A = [[0] * m for _ in range(m)]def f(x):A = []for _ in range(3):A.append(x & 3)x >>= 2return A"""0: 空1: 左2: 右3: 縦"""def tate(A):c = A.count(3)if c & 1:return Falseif c == 2:if A[0] == A[2] == 3:return Falseif A[0] == A[1] == 0:return Falseif A[1] == A[2] == 0:return Falsereturn Truedef ok(l, r):L = f(l)R = f(r)if not tate(L) or not tate(R):return Falsefor a, b in zip(L, R):if a == b == 0:return Falseif a == 2 and b == 1:passelif a == 2 or b == 1:return Falsereturn Truefor l in range(m):for r in range(m):if ok(l, r):A[r][l] = 1B = [0] * mB[1 + 4 + 16] = 1B = matpow(A, B, n)ans = 0for i in range(m):A = f(i)if 2 in A:continueif tate(A):ans += B[i]print(ans % MOD)