[Gold II] Title: 피보나치 수 6, Time: 60 ms, Memory: 34924 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-19 13:40:11 +09:00
parent 190615bf03
commit 8c93da0269
2 changed files with 70 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# [Gold II] 피보나치 수 6 - 11444
[문제 링크](https://www.acmicpc.net/problem/11444)
### 성능 요약
메모리: 34924 KB, 시간: 60 ms
### 분류
분할 정복을 이용한 거듭제곱, 수학
### 제출 일자
2025년 3월 19일 13:39:41
### 문제 설명
<p>피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.</p>
<p>이를 식으로 써보면 F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub> (n ≥ 2)가 된다.</p>
<p>n=17일때 까지 피보나치 수를 써보면 다음과 같다.</p>
<p>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597</p>
<p>n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.</p>
### 입력
<p>첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.</p>
### 출력
<p>첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다.</p>

View File

@@ -0,0 +1,34 @@
from sys import stdin
from collections import defaultdict
input = stdin.readline
MOD = 1000000007
dp = defaultdict(int)
dp[0] = 0
dp[1] = 1
dp[2] = 1
def fibonacci(n):
if not dp[n]:
if n & 1:
fn = fibonacci(n // 2)
fnp = fibonacci(n // 2 + 1)
dp[n] = (fn ** 2 + fnp ** 2) % MOD
else:
fn = fibonacci(n // 2)
fnm = fibonacci(n // 2 - 1)
dp[n] = (fn * (fn + 2 * fnm)) % MOD
return dp[n]
N = int(input())
fibonacci(N)
print(dp[N])