[파이썬] 백준 10830번 행렬 제곱
작성:
백준 #10830 행렬 제곱
# B//2 번 제곱한 결과를 제곱한다.
# B%2라면 A를 한번 더 곱한다.
# 두 행렬 곱셈 aij bij
# -> a11 * b11 + a12 * b21 + a13 * b31 (A 1행 X B 1열)
# -> a11 * b12 + a12 * b22 * a13 * b32 (A 1행 X B 2열)
def multiply(mat1, mat2):
n = len(mat1)
mat = [[0] * n for i in range(n)]
for i in range(n):
for j in range(n):
temp = 0
for k in range(n):
temp += mat1[i][k] * mat2[k][j]
mat[i][j] = temp % 1000
return mat
def pow(matrix, n, unit):
if n == 1: return multiply(matrix, unit)
if n & 1: return multiply(pow(multiply(matrix, matrix), n // 2, unit), matrix)
else: return pow(multiply(matrix, matrix), n // 2, unit)
def solution(N, B):
matrix = [list(map(int, input().split())) for i in range(N)]
unit = [[0] * N for i in range(N)]
for i in range(N):
for j in range(N):
if i == j: unit[i][j] = 1
result = pow(matrix, B, unit)
for _ in range(N):
print(*result[_])
if __name__ == '__main__':
solution(*map(int, input().split()))
댓글남기기