문제.
풀이.
피보나치를 행렬의 거듭제곱으로 풀 수 있다는 사실을 몰랐었는데 이번 문제를 풀면서 알게되었다.
피보나치를 그냥 계산하면 시간 복잡도가 O(n)을 가지지만 행렬의 거듭제곱을 이용하면 O(logn)의 시간 복잡도를 가지게 된다.
식은 다음과 같다.
소스코드.
import sys
def Square(b):
if b == 1:
return matrix
temp = Square(b // 2)
if b % 2 == 0:
result = matrix_multiple(temp,temp)
return result
elif b % 2 == 1:
result = matrix_multiple(temp,temp)
result = matrix_multiple(result, matrix)
return result
# 행렬 곱
def matrix_multiple(temp1, temp2):
result_matrix = [[0 for i in range(2)] for j in range(2)]
for i in range(2):
for j in range(2):
result_matrix[i][j] = multiple(i, j, temp1, temp2)
return result_matrix
# 행렬 곱 연산
def multiple(x, y, temp1, temp2):
result = 0
mat2 = [mat[y] for mat in temp2]
for i, j in zip(temp1[x], mat2):
result += i * j
return result % 1000000007
N= int(sys.stdin.readline())
matrix = [[1, 1], [1, 0]]
result = Square(N)
result = result[0][1]
print(result)
'프로그래밍 > 백준' 카테고리의 다른 글
백준 11053 - 가장 긴 증가하는 부분 수열 (0) | 2021.07.14 |
---|---|
백준 2156 포도주 시식 - 파이썬 (0) | 2021.07.14 |
백준 11401 이항 계수 3 - 파이썬 (0) | 2021.07.14 |
백준 10830 행렬 제곱 - 파이썬 (0) | 2021.07.13 |
백준 1676 팩토리얼 0의 개수 - 파이썬 (0) | 2021.07.13 |