๐ฑ ๋ฌธ์
๐ฑ ํ์ด
์ด ๋ฌธ์ ์ ๊ด๊ฑด์ 100,000,000,000๊น์ง ๊ฐ์ง ์ ์๋ ๋งค์ฐ ํฐ ์ง์๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ํ๋ ฌ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณฑํ๋ ๋์ , ํ๋ ฌ์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๋ถํ ์ ๋ณต(Divide and Conquer) ๊ธฐ๋ฒ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
1) ์ ๋ ฅ ๋ฐ๊ธฐ
N, B = map(int, input().split())
matrix = []
for _ in range(N):
matrix.append(list(map(int, input().split())))
2) ํ๋ ฌ ์ ๊ณฑ์ ๊ตฌํ๋ ํจ์(Divide and Conquer)
def pow_matrix(matrix, B):
"""
ํ๋ ฌ matrix๋ฅผ B ์ ๊ณฑํ๋ ํจ์
"""
if B == 1:
return [[element % 1000 for element in row] for row in matrix]
if B == 2:
return multiply_matrix(matrix, matrix)
if B % 2 == 0:
matrix = pow_matrix(pow_matrix(matrix, B//2), 2)
else:
matrix = multiply_matrix(pow_matrix(
pow_matrix(matrix, B//2), 2), matrix)
return matrix
์ง์๊ฐ ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์ ํ๋ ฌ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณฑํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ ์ด์ฉํฉ๋๋ค. ๋ค์ ์์์ผ๋ก ํจ์จ์ ์ผ๋ก ๊ณ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
• B๊ฐ ์ง์์ผ ๊ฒฝ์ฐ: $A^B = A^{B/2} \times A^{B/2}$
• B๊ฐ ํ์์ผ ๊ฒฝ์ฐ: $A^B = A \times A^{B-1} = A \times A^{(B-1)/2} \times A^{(B-1)/2}$
B
๊ฐ ์ง์์ผ ๋์ ํ์์ธ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์์์ผ๋ก ์ฌ๊ท์ ์ผ๋ก ๋ค์ด๊ฐ๋๋ก ์์ฑํ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ทํจ์์ base case๊ฐ ๋๋ ์กฐ๊ฑด์ B๊ฐ 1์ผ ๋์ธ 2์ผ ๋์
๋๋ค. B๊ฐ 2์ผ ๋๋ ํ๋ ฌ์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๊ณ์ฐ(multiply_matrix()
ํจ์)ํ์ฌ ๋ฆฌํดํ๊ณ , B
๊ฐ 1์ผ ๋๋ ๋ชจ๋ ์์๋ฅผ 1000์ผ๋ก ๋๋ ๋๋จธ์ง๋ก ๋ฐ๊พธ์ด ๊ทธ๋๋ก ๋ฆฌํดํฉ๋๋ค!
3) ๋ ํ๋ ฌ์ ๊ณฑํ๋ ํจ์
def multiply_matrix(A, B):
"""
๋ ํ๋ ฌ A, B๋ฅผ ๊ณฑํ๋ ํจ์
"""
n = len(A)
result = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
result[i][j] = sum(
[(a * b) for a, b in zip(A[i], [b[j] for b in B])]) % 1000
return result
ํ๋ ฌ์ ๊ฑฐ๋ญ์ ๊ณฑํด์ฃผ๋ ํจ์๋ pow_matrix()
ํจ์์์์ ํธ์ถ๋๋๋ฐ, B=2์ธ ๊ธฐ์ ์กฐ๊ฑด์ ๊ฑธ๋ฆด ๋์ B
๊ฐ ํ์์ธ ๊ฒฝ์ฐ, $A \times A^{B-1}$๋ฅผ ๊ณ์ฐํ ๋ ํธ์ถํฉ๋๋ค.
4) ์ถ๋ ฅํ๊ธฐ
for row in result:
print(' '.join(map(str, row)))
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/python
# -*- coding: utf-8 -*-
# boj 10830 ํ๋ ฌ์ ๊ณฑ
import sys
input = sys.stdin.readline
def multiply_matrix(A, B):
n = len(A)
result = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
result[i][j] = sum(
[(a * b) for a, b in zip(A[i], [b[j] for b in B])]) % 1000
return result
def pow_matrix(matrix, B):
if B == 1:
return [[element % 1000 for element in row] for row in matrix]
if B == 2:
return multiply_matrix(matrix, matrix)
if B % 2 == 0:
matrix = pow_matrix(pow_matrix(matrix, B//2), 2)
else:
matrix = multiply_matrix(pow_matrix(
pow_matrix(matrix, B//2), 2), matrix)
return matrix
N, B = map(int, input().split())
matrix = []
for _ in range(N):
matrix.append(list(map(int, input().split())))
result = pow_matrix(matrix, B)
for row in result:
print(' '.join(map(str, row)))
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #2531 ํ์ ์ด๋ฐฅ (Python, Sliding window, ์๊ฐ์ด๊ณผ ํด๊ฒฐ) (1) | 2024.09.02 |
---|---|
[BOJ] #5430 AC (Python, Deque, ์๊ฐ ์ด๊ณผ ํด๊ฒฐ) (0) | 2024.07.13 |
[BOJ] #2437 ์ ์ธ (Python, Greedy) (0) | 2023.03.19 |
[BOJ] #11000 ๊ฐ์์ค ๋ฐฐ์ (Python, ์ฐ์ ์์ ํ, ๊ทธ๋ฆฌ๋) (2) | 2023.03.17 |
[BOJ] #16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (0) | 2023.03.14 |
๋๊ธ