728x90
https://www.acmicpc.net/problem/11444
- 풀이
- 재귀로 하나하나 피보나치 수를 구하니 시간초과
- 분할 정복을 이용한 거듭 제곱 활용
- 아래 그림으로 설명
- 코드
import sys
input = sys.stdin.readline
# 행렬 제곱
def power(adj,n):
if n == 1:
return adj
# n이 짝수인 경우
elif n%2 == 0:
return power(multi(adj,adj),n//2)
# n이 홀수인 경우
else:
return multi(power(adj,n-1),adj)
# 행렬의 곱셈
def multi(a,b):
temp = [[0]*len(b[0]) for _ in range(2)]
for i in range(2):
for j in range(len(b[0])):
s = 0
for k in range(2):
s += a[i][k]*b[k][j]
temp[i][j] = s%1000000007
return temp
N = int(input())
# 초기 행렬
adj = [[1,1],[1,0]]
# 초기값
start = [[1],[1]]
if N < 3:
print(1)
else:
print(multi(power(adj,N-2),start)[0][0])
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
파이썬 - 런타임 에러 (RecursionError) 해결법 (0) | 2023.04.03 |
---|---|
[백준] 2263. 트리의 순회 - Python (0) | 2023.04.03 |
파이썬 시간 복잡도 in 연산자 (0) | 2023.04.02 |
파이썬 구간 합 구하기 (accumulate) (0) | 2023.04.02 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 5 DFS/BF (0) | 2023.03.24 |
댓글