๋ฌธ์
https://www.acmicpc.net/problem/10830
๋ฐฑ์ค ๋จ๊ณ๋ณ๋ก ํ์ด๋ณด๊ธฐ - ๋ถํ ์ ๋ณต
ํ์ด
NxN ํ๋ ฌ์ B๋ฒ ๊ณฑํ ๊ฐ % 1000 ์ ์ถ๋ ฅํ๋ ๋ฌธ์ ๋ค.
# ๋ฉ๋ชจ๋ฆฌ: 31252KB / ์๊ฐ: 44ms
from sys import stdin
# 1
input = stdin.readline
N, B = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
p = 1000
A = [[col % p for col in row] for row in A]
# 2
def make_matrix(arr1: list, arr2: list) -> list:
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] += arr1[i][k] * arr2[k][j]
tmp[i][j] %= p
return tmp
# 3
def make_square(arr: list, n: int) -> list:
if n == 1:
return arr
if n % 2 == 0:
half = make_square(arr, n//2)
return make_matrix(half, half)
else:
return make_matrix(arr, make_square(arr, n-1))
# 4
ret = make_square(A, B)
for line in ret:
print(" ".join(str(l) for l in line))
๋จ๊ณ๋ณ ํ์ด
1. ์ ๋ ฅ๊ฐ ํ ๋น
from sys import stdin
input = stdin.readline
N, B = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
p = 1000
A = [[col % p for col in row] for row in A]
- input์
stdin.readline์ผ๋ก ์ฌ์ ์ํด์ฃผ๊ณ , ํ(์ด)์ ๊ฐฏ์N๊ณผ ๊ณฑํ ํ์B๋ฅผ ํ ๋นํ๋ค. - ํ๋ ฌ
A๋ฅผ ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ผ๋ก ์ ์ฅํ๋ค. ๋๋ ์ผ ํ ๊ฐ 1000๋p๋ก ํ ๋นํด์ค๋ค.- โ ์ฌ๊ธฐ์ ์ค์ํ๊ฒ, ์ฐ๋ฆฌ๋ ์ด ์
๋ ฅ๋ฐ์
A์ ์์๋ค๋ 1000์ผ๋ก ๋๋์ด์ค์ผํ๋ค.
- โ ์ฌ๊ธฐ์ ์ค์ํ๊ฒ, ์ฐ๋ฆฌ๋ ์ด ์
๋ ฅ๋ฐ์
A์ ๊ฐ ์์๋ค์p๋ก ๋๋ ๋๋จธ์ง๊ฐ์ ๋ค์A์ ํ ๋นํ๋ค.
2. ํ๋ ฌ๊ณฑ ํจ์ ์์ฑ
def make_matrix(arr1: list, arr2: list) -> list:
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] += arr1[i][k] * arr2[k][j]
tmp[i][j] %= p
return tmp
- ํ๋ ฌ 1, 2์ ๊ณฑ์
๊ฐ์ ๋ฐํํด์ค ํจ์
make_matrix(ํ๋ ฌ1, ํ๋ ฌ2)๋ฅผ ์์ฑํ๋ค. tmp: ํ๋ ฌ๊ณฑ์ ์ ์ฅํ ๋ฆฌ์คํธ.- ์ฌ๊ธฐ์ ์ผ์ค for๋ฌธ์ ์ฌ์ฉํ๋ค.
i: ํj: ์ดk:tmp[i][j]๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํดN๋งํผ ๋ฐ๋ณต. ํ๋ ฌ1(NxN) * ํ๋ ฌ2(NxN) ์ด๋ฏ๋ก ๊ณตํต๋๋ ๋ฐ๋ณตํ์๋ N์ด๋ค.
- ์ ์ผ ์์ชฝ์ for๋ฌธ ๋ฐ๋ณต์ ๋ง์น๋ฉด
tmp[i][j]์ ๊ฐ์ด ๊ตฌํด์ง๊ณ , ์ด๊ฑธp๋ก ๋๋ ๋๋จธ์ง๊ฐ์tmp[i][j]์ ์ฌํ ๋นํ๋ค. - ๋ชจ๋ ๋ฐ๋ณต์ ๋ง์น๋ฉด ๋ฆฌ์คํธ
tmp๋ฅผ ๋ฐํํ๋ค.
3. ์ ๊ณฑ ์ฒ๋ฆฌ ํจ์ ์์ฑ
def make_square(arr: list, n: int) -> list:
if n == 1:
return arr
if n % 2 == 0:
half = make_square(arr, n//2)
return make_matrix(half, half)
else:
return make_matrix(arr, make_square(arr, n-1))
$ A^{8} $
$ = A^{4} * A^{4} $
$ = A^{2}*A^{2} * A^{2}*A^{2} ... $์ด๋ค.
B์ ๊ฐ์ ๋ฐ๋ผ ๋ถํ ํด์ค ํจ์make_square(๋ฆฌ์คํธ, ์ ๊ณฑ๊ฐ)์ ์์ฑํ๋ค.- ๋ง์ฝ
n์ด 1์ด๋ผ๋ฉด ๊ทธ๋๋ก ๋ฆฌ์คํธarr(=A)์ ๋ฐํํด์ค๋ค. n์ด ์ง์๋ผ๋ฉด,make_square(arr, n//2)์ ๊ฐ์half์ ํ ๋น ํ, ํ๋ ฌ๊ณฑ ํจ์make_matrix(half, half)๋ฅผ ๋ฐํํ๋ค.
- ํ์๋ผ๋ฉด,
- A^5 = A x A^2 x A^2 ์ด๋ฏ๋ก,
make_matrixํจ์์arr(=A), ์ ๊ณฑ์-1์ ํ ๊ฐ์ ๋ฃ์ด ๋ฐํํ๋ค.
4. ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ
ret = make_square(A, B)
for line in ret:
print(" ".join(str(l) for l in line))
make_square(A, B)์ ์คํํ ๊ฒฐ๊ณผret์ ํ ํ์ฉ ์ํํ๋ค.- ๊ฐ ํ์ ์์๋ฅผ str๋ก ๋ณํ ํ ๊ณต๋ฐฑ
" "๊ณผ ํจ๊ป ํฉ์ณ์ค ๋ค ์ถ๋ ฅ.