https://www.acmicpc.net/problem/11444
입력
첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다.
코드
from collections import defaultdict
n = int(input())
dp = defaultdict(int)
dp[0] = 0
dp[1] = 1
dp[2] = 1
def fibonacci(n):
if not dp[n]:
if n % 2 == 0:
fn = fibonacci(n//2)
fn_1 = fibonacci(n//2 - 1)
dp[n] = (fn * (fn + 2 * fn_1)) % 1000000007
else:
fn1 = fibonacci(n//2 + 1)
fn = fibonacci(n//2)
dp[n] = ((fn1 * fn1) + (fn * fn)) % 1000000007
return dp[n]
print(fibonacci(n))
도가뉴 항등식
1. 짝수 n = 2k 일 때
2. 홀수 n = 2k + 1 일 때
이 방식은 분할 정복을 이용한 피보나치 수 계산 (Fast Doubling Fibonacci) 이므로,
거듭제곱을 계산하는 방식처럼 O(log n) 의 시간 복잡도를 가짐.
즉, 100경(10¹⁸) 이상의 피보나치 수도 빠르게 계산할 수 있음!
지피티의 내 코드에 대한 한줄평..ㅋㅋㅋ
'Program Solving > Python' 카테고리의 다른 글
[BOJ/Python] 11054번: 가장 긴 바이토닉 부분 수열 | LBS (0) | 2025.03.28 |
---|---|
[BOJ/Python] 2659번: 십자카드 문제 (0) | 2025.03.23 |
[BOJ/Python] 4948번: 베르트랑 공준 | 에라토스테네스의 체 (0) | 2025.02.06 |
[BOJ/Python] 1934: 최소공배수 | 유클리드 호제법 (Euclidean Algorithm) (0) | 2025.02.03 |
[BOJ/Python] 2166번: 다각형의 면적 | 신발끈 공식 (0) | 2025.02.02 |