๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 10830 - ํ–‰๋ ฌ ์ œ๊ณฑ

by huis_log 2025. 7. 12.

ํ–‰๋ ฌ ์ œ๊ณฑ (๋ฐฑ์ค€ 10830)

N×N ์ •์ˆ˜ ํ–‰๋ ฌ A์™€ ์ •์ˆ˜ B๊ฐ€ ์ฃผ์–ด์ง. A๋ฅผ B๋ฒˆ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•จ. ๋‹จ, ๋ชจ๋“  ๊ณ„์‚ฐ์€ mod 1000.

 

์ „๋žต

์ž…๋ ฅ ํฌ๊ธฐ ์ž‘์•„๋ณด์ด์ง€๋งŒ B๋Š” ์ตœ๋Œ€ 10^9๋ผ์„œ ๋‹จ์ˆœ ๊ณฑ์…ˆ์œผ๋ก  ์‹œ๊ฐ„ ์ดˆ๊ณผ. ๋ถ„ํ•  ์ •๋ณต์œผ๋กœ ์ œ๊ณฑ ์ฒ˜๋ฆฌํ•ด์•ผ ํ†ต๊ณผ ๊ฐ€๋Šฅ.

๊ทธ๋ƒฅ A^B ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. B๊ฐ€ ์ตœ๋Œ€ 10^9๋ผ์„œ ๋‹จ์ˆœํžˆ ๊ณฑํ•˜๋ฉด ์‹œ๊ฐ„ ํ„ฐ์ง. ๋ฌด์กฐ๊ฑด ๋ถ„ํ•  ์ •๋ณต ์จ์•ผ ํ•จ.

ํ•ต์‹ฌ์€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ , b๋ฅผ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ๋ฉด์„œ ์žฌ๊ท€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ.

 

1. ํ–‰๋ ฌ ๊ณฑ์…ˆ์€ A[i][k] * B[k][j] ๋ˆ„์ ํ•ด์„œ result[i][j]์— ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ.

2. ์žฌ๊ท€์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด b==1์ผ ๋•Œ mod 1000 ์ฒ˜๋ฆฌ๋œ ์›๋ณธ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•ด์•ผ ํ•จ. ๋ฌธ์ œ์—์„œ ์ถœ๋ ฅ์€ ์ „๋ถ€ mod 1000์ด๋ผ ์•ˆ ํ•˜๋ฉด ํ‹€๋ฆผ.
3. ํ™€์ˆ˜ ์ œ๊ณฑ์ผ ๋•Œ๋Š” ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ ๊ฑฐ ๋‘ ๋ฒˆ ๊ณฑํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ ๋” ๊ณฑํ•ด์ค˜์•ผ ์ง„์งœ b์ œ๊ณฑ ๋จ. ์ด๊ฑฐ ์•ˆ ํ•˜๋ฉด b๊ฐ€ ํ™€์ˆ˜์ผ ๋•Œ ๊ฒฐ๊ณผ ์ž˜๋ฆผ.

4. ๊ทธ๋ฆฌ๊ณ  base case์—์„œ ๋ฆฌํ„ด ์•ˆ ํ•˜๋ฉด ๋ฌดํ•œ์žฌ๊ท€ ๋น ์ ธ์„œ RecursionError ๋œฌ๋‹ค. ๋ง๋„ ์•ˆ ๋˜๋Š” ์‹ค์ˆ˜๋กœ ์‹œ๊ฐ„ ๋‚ ๋ฆฌ์ง€ ๋งˆ๋ผ.


import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**6)

# ํ–‰๋ ฌ ๊ณฑ์…ˆ
def mat_mul(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]
            result[i][j]%=1000
    return result

def mat_pow(matrix,b):
    # base case
    if b==1:
        return [[x%1000 for x in row] for row in matrix]
    
    half=mat_pow(matrix,b//2)
    result=mat_mul(half,half)
    
    # ํ™€์ˆ˜ ์ œ๊ณฑ์ผ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ ๋” ๊ณฑํ•ด์คŒ
    if b%2==1:
        result=mat_mul(result,matrix)
    
    return result

def main():
   n,b=map(int,input().split())
   matrix=[list(map(int,input().split())) for _ in range(n)]
   result=mat_pow(matrix,b)
   for row in result:
       print(*row)
    
if __name__=="__main__":
    main()
๋ฐ˜์‘ํ˜•