본문 바로가기
BOJ

[python]백준 10830번 - 행렬 제곱

by yujinkimkim 2023. 8. 24.

10830번: 행렬 제곱 (acmicpc.net)

 

10830번: 행렬 제곱

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

www.acmicpc.net

import sys
input = sys.stdin.readline

n, b = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]

def matrix_multiply(A, B):
    n = len(A)
    result = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            for k in range(n):
                result[i][j] += A[i][k] * B[k][j] % 1000
    return result

def matrix_power(A, exp):
    if exp == 1:
        return A
    if exp % 2 == 0:
        half = matrix_power(A, exp // 2)
        return matrix_multiply(half, half)
    else:
        half = matrix_power(A, (exp - 1) // 2)
        return matrix_multiply(matrix_multiply(half, half), A)

result = matrix_power(arr, b)

for row in result:
    print(*row)

댓글