import sys
input = sys.stdin.readline
def BOJ10830() :
N, B = map(int, input().split())
def matrix_mul(a, b) :
result = [[0 for _ in range(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]) % 1000
for i in range(N) :
for j in range(N) :
result[i][j] %= 1000
return result
def divide(a, count) :
if count == 1 :
return a
tmp = divide(a, count // 2)
if count % 2 == 1 :
return matrix_mul(matrix_mul(tmp, tmp), a)
else :
return matrix_mul(tmp, tmp)
array = []
for _ in range(N) :
array.append(list(map(int, input().split())))
answer = divide(array, B)
for i in range(N) :
for j in range(N) :
print(answer[i][j] % 1000, end = " ")
print()
BOJ10830()
접근방법 :
1. B의 범위가 굉장히 커서 제곱을 해줄때 O(N)의 시간 복잡도가 발생해서 무조건 시간 초과다
거듭제곱의 분할 정복 방식으로 접근해야 한다(divide 함수 부분)
장애물이였던 것:
1. 행렬의 계산을 나타내는 것에서 굉장히 애를 먹었다. 머리가 막힐때는 직접 손으로 적어보고 먼저 흐름을 단순히 구현해보자
https://www.acmicpc.net/problem/10830
10830번: 행렬 제곱
크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
앱 [백준 7579] - python (0) | 2022.02.11 |
---|---|
곱셈 [백준 1629] - python (0) | 2022.02.10 |
이항계수 [백준 11401] - python (0) | 2022.02.08 |
신나는 함수 실행 [백준 9184] - python (0) | 2022.02.07 |
피보나치 함수 [백준 1003] - python (0) | 2022.02.06 |