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