Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
Archives
- Today
- Total
기록
백준_10830_행렬 제곱 본문
문제
https://www.acmicpc.net/problem/10830
풀이
1) 분할 정복을 이용한 거듭제곱
number을 n번 곱한다고 하면, 아래처럼 적을 수 있다. 이를 행렬에도 적용하면, 문제를 해결할 수 있다.
def power(number, n) :
if n==0 : return 1
elif n이 짝수 : return power(number², n//2)
elif n이 홀수 : return number*power(number², n//2)
문제에서는 n의 최대값을 100000000000으로 두고 있다. n을 최대값으로 하더라도, 37번에서 탐색이 끝난다.
2) 행렬곱
3) 1000으로 나눈 나머지
1000으로 나누어진 행렬을 반환해야 하므로, 아래와 같은 예제를 고려해야 한다.
ex) 행렬A를 1번 제곱하면 행렬B를 반환해야 한다.
코드
# 행렬의 제곱 처리하기
def power(arr, n):
if n<=1 : return remainder(arr)
if n%2==0 :
square = product(arr, arr)
return power(square, n//2)
else :
square = product(arr, arr)
temp = power(square, n//2)
return product(arr, temp)
# 행렬 * 행렬
def product(a, b) :
answer = [[0 for j in range(N)] for i in range(N)]
for i in range(N) :
for j in range(N) :
for k in range(N) :
answer[i][j] += a[i][k]*b[k][j]
return remainder(answer)
# 1000으로 나눈 나머지
def remainder(a) :
for i in range(N) :
for j in range(N) :
a[i][j]%=1000
return a
N, B = map(int, input().split())
arr = [list(map(int, input().split())) for i in range(N)]
ans = power(arr, B)
for i in range(N) :
print(" ".join(list(map(str, ans[i]))))
'코딩테스트 > python' 카테고리의 다른 글
백준_14391_종이조각 (0) | 2022.05.10 |
---|---|
백준_15661_링크와 스타트 (0) | 2022.05.03 |
백준_2961_도영이가 만든 맛있는 음식 (0) | 2022.04.22 |
백준_1022_소용돌이 예쁘게 출력하기 (0) | 2022.04.19 |
백준_2208_보석 줍기 (0) | 2022.04.07 |
Comments