Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def mulmat(A, B, P):
- #A*B=C
- if B == 1: return A
- if A == 1: return B
- C = [[None for i in range(len(B[0]))] for j in range(len(A))]
- for i in range(len(A)):
- for j in range(len(B[0])):
- C[i][j] = sum((A[i][k]*B[k][j] % P for k in range(len(B)))) % P
- return C
- def quickpow(A, n, P):
- if n == 0: return 1
- elif n%2 == 0: return quickpow(mulmat(A,A,P), n//2,P)
- else: return mulmat(quickpow(A, n-1,P), A,P)
- def check(x, y, N):
- x = bin(x)[2:].zfill(N)
- y = bin(y)[2:].zfill(N)
- c = [None for i in range(N)]
- for i in range(N):
- if x[i] == '0':
- c[i] = 1
- for i in range(N):
- #if c[i] is None and y[i] == '1': return 0
- if c[i] == 1 and y[i] == '0': return 0
- return 1
- def build_pat(N):
- A = [[check(j,i,N) for i in range(2**N)] for j in range(2**N)]
- return A
- #rectangle NxM, N <= M
- N, M = map(int, input().split())
- #if N>M: N, M = M, N
- pat = build_pat(N)
- print(*pat, sep='\n')
- print()
- npat = quickpow(pat, M-1, 10**9+7)
- print(*npat, sep='\n')
- A = [[0] for i in range(2**N-1)] + [[1]] #first column
- print(mulmat(quickpow(pat, M-1, 10**9+7), A, 10**9+7))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement