๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] [Gold4] 10830๋ฒˆ_ํ–‰๋ ฌ ์ œ๊ณฑ

Dbswnstjd 2023. 2. 20. 00:18

๋ฌธ์ œ

https://www.acmicpc.net/problem/10830

 

10830๋ฒˆ: ํ–‰๋ ฌ ์ œ๊ณฑ

ํฌ๊ธฐ๊ฐ€ N*N์ธ ํ–‰๋ ฌ A๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, A์˜ B์ œ๊ณฑ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ˆ˜๊ฐ€ ๋งค์šฐ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, A^B์˜ ๊ฐ ์›์†Œ๋ฅผ 1,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

ํ’€์ด

# ๋ฐฑ์ค€ 10830๋ฒˆ ๋ฌธ์ œ - ํ–‰๋ ฌ ์ œ๊ณฑ
import sys
input = sys.stdin.readline

# ์ž…๋ ฅ
N, B = map(int, input().split())
matrix = []
for _ in range(N):
    matrix.append(list(map(int, input().split())))

# ํ–‰๋ ฌ ๊ณฑ์…ˆ
def mul_matrix(mat1, mat2):
    res = [[0]*N for _ in range(N)]
    for i in range(N):
        for j in range(N):
            for z in range(N):
                # c11 = a11*b11 + a12*b21
                res[i][j] += mat1[i][z] * mat2[z][j] % 1000
    return res

# ๋ถ„ํ• ์ •๋ณต
def power(a, b):
    if b == 1:  # b์˜ ๊ฐ’์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ ์žฌ๊ท€
        return a
    else:
        tmp = power(a, b // 2)  # a^(b // 2)
        if b % 2 == 0:
            return mul_matrix(tmp, tmp)  # b๊ฐ€ ์ง์ˆ˜์ธ ๊ฒฝ์šฐ
        else:
            return mul_matrix(mul_matrix(tmp, tmp), a)  # b๊ฐ€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ
result = power(matrix, B)

# ์ถœ๋ ฅ
for row in result:
    for col in row:
        print(col % 1000, end=" ")
    print()