코딩테스트 대비/BOJ

[Baekjoon/Python] 10830번: 행렬 제곱 - 효과는 굉장했다!

bluetag_boy 2022. 6. 12. 03:58
반응형
 

10830번: 행렬 제곱

크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

알고리즘 분류

  • 수학
  • 분할 정복
  • 분할 정복을 이용한 거듭제곱
  • 선형대수학

 

 

SOLUTION

import sys

def mulmatrix(m1, m2):
    tmp =  [[0] * N for _ in range(N)]

    # 행렬 곱 계산
    for i in range(N):
        for j in range(N):
            for k in range(N):
                tmp[i][j] += m1[i][k] * m2[k][j]
            
            tmp[i][j] %= 1000 # 연산 속도를 높이기 위해 계속 1000으로 나눠준다
         
    return tmp


# 분할 정복
def devide(square, matrix):
    if square == 1:
        return matrix

    else:
        if square % 2 == 0:
            matrix = devide(square//2, matrix)
            return mulmatrix(matrix, matrix)

        else:
            matrix = devide(square-1, matrix)
            return mulmatrix(first_matrix, matrix)


N, B = map(int, sys.stdin.readline().split())
first_matrix = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

for col in range(N):
    for row in range(N):
        print(devide(B, first_matrix)[col][row] % 1000, end =" ") 
    print()