반응형

   문제

   https://www.acmicpc.net/problem/10830



분할정복으로 제곱을 구현했던것과 같다.

(A)^8을 계산하는데 8번(N번) 계산해야한다면

(A^2)^2)^2로 구할시 3번(logN번)만에 계산할수있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys
N,B=map(int,sys.stdin.readline().split())
A=[list(map(int,sys.stdin.readline().split())) for _ in range(N)]
 
 
def matric_mul(A,B):
    if B==1:
        for i in range(N):
            for j in range(N):
                A[i][j]%=1000
        return A
 
    elif B%2==1:
        tmp=[[0 for _ in range(N)] for _ in range(N)]
        C=matric_mul(A,B-1)
        for i in range(N):
            for j in range(N):
                for k in range(N):
                    tmp[i][j]+=C[i][k]*A[k][j]
                tmp[i][j]%=1000
 
        return tmp
 
    else:
        tmp=[[0 for _ in range(N)] for _ in range(N)]
        C=matric_mul(A,B//2)
        for i in range(N):
            for j in range(N):
                for k in range(N):
                    tmp[i][j]+=C[i][k]*C[k][j]
                tmp[i][j]%=1000
        return tmp
 
result=matric_mul(A,B)
for li in result:
    for p in li:
        print(p,end=' ')
    print()

cs





반응형

'알고리즘(python) > 기본' 카테고리의 다른 글

[Python]동적계획법2 백준 2293  (0) 2020.02.04
[Python]분할정복 백준 2749  (0) 2020.01.29
[Python]분할정복 백준 2740  (0) 2020.01.28
[Python]분할정복 백준 1629  (0) 2020.01.26
[Python]분할정복 백준 1780  (0) 2020.01.24
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기