๐ฑ ๋ฌธ์
๐ฑ ํ์ด
์ด ๋ฌธ์ ์ ๊ด๊ฑด์ 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 |

๋๊ธ