문제.
풀이.
분할정복의 제곱거듭 공식과 행렬의 공식을 합쳐서 풀면 된다.
지수가 짝 수이면 n^(지수/2) * n^(지수/2), 지수가 홀 수 이면 n^(지수/2) * n^(지수/2) * n
이런 방식으로 풀면 된다.
소스코드.
import sys
def Square(b):
if b == 1:
return matrix
temp = Square(b // 2)
if b % 2 == 0:
result = matrix_multiple(temp,temp)
return result
elif b % 2 == 1:
result = matrix_multiple(temp,temp)
result = matrix_multiple(result, matrix)
return result
# 행렬 곱
def matrix_multiple(temp1, temp2):
result_matrix = [[0 for i in range(N)] for j in range(N)]
for i in range(len(temp1)):
for j in range(len(temp1)):
result_matrix[i][j] = multiple(i, j, temp1, temp2)
return result_matrix
# 행렬 곱 연산
def multiple(x, y, temp1, temp2):
result = 0
mat2 = [mat[y] for mat in temp2]
for i, j in zip(temp1[x], mat2):
result += i * j
return result % 1000
N, B = map(int, sys.stdin.readline().split())
matrix = []
for i in range(N):
m = list(map(int, sys.stdin.readline().split()))
matrix.append(m)
result = Square(B)
for i in result:
for j in i:
print(j % 1000, end= ' ') # B값이 1인 경우에 여기서도 % 1000을 해줌
print()
'프로그래밍 > 백준' 카테고리의 다른 글
백준 11444 피보나치 수 6 - 파이썬 (0) | 2021.07.14 |
---|---|
백준 11401 이항 계수 3 - 파이썬 (0) | 2021.07.14 |
백준 1676 팩토리얼 0의 개수 - 파이썬 (0) | 2021.07.13 |
백준 9375 패션왕 신해빈 - 파이썬 (0) | 2021.07.13 |
백준 1010 다리 놓기 - 파이썬 (0) | 2021.07.13 |