¡Diste a luz a un bebé cuando ya casi tienes 50 años! ¿En qué estabas pensando? – le reprochaban sus familiares al teléfono.

Life Lessons

¡Tener un hijo casi a los 50! ¿En qué estabas pensando? me reprochaban mis familiares al teléfono.

Tengo 46 años. Hace un mes, di a luz a gemelos: un niño, Arturo, y una niña, Elena. No hay palabras para describir lo que siento al mirarlos. Felicidad, alegría, lágrimas, un calor que me llena el pecho hasta reventar, la verdad.

Pero ni mi madre ni mi hermana vinieron siquiera al hospital cuando me dieron el alta. Los parientes de mi marido también ignoraron el nacimiento de nuestros hijos. Todo por nuestra edad.

Nunca pensé en tener hijos, la verdad. Era joven, disfrutaba de la vida sin preocupaciones, salía de fiesta a discotecas. ¿Qué más podía pedir una chica para ser feliz? Cócteles, pretendientes, noches de diversión. Mi alma cantaba de alegría.

Pero a los 22 conocí a Javier. Un tipo guapo, con barba y gafas, que hacía reír a todos. Las chicas se volvían locas por él, pero me eligió a mí. Reconozco que eso me subió mucho la autoestima. Javier tenía piso, coche y un negocio familiar. Sus padres poseían varias tiendas de ropa en la ciudad y ganaban buen# [Gold I] 피보나치 수 6 – 11444

[문제 링크](https://www.acmicpc.net/problem/11444)

### 성능 요약

메모리: 31256 KB, 시간: 44 ms

### 분류

분할 정복을 이용한 거듭제곱, 수학

### 문제 설명

피보나치 수는 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으로 나눈 나머지를 출력한다.

### 문제 풀이

피보나치 수를 행렬의 거듭제곱으로 나타낼 수 있다.

피보나치 수의 점화식 Fn = Fn-1 + Fn-2 에서 아래와 같은 식을 유도할 수 있다.

[ Fn Fn-1 ] = [ Fn-1 Fn-2 ] x [ 1 1 ]

[ 1 0 ]

이 식에서 다시 피보나치 수를 행렬의 거듭제곱으로 나타내면 아래와 같다.

[ Fn Fn-1 ] = [ F1 F0 ] x [ 1 1 ] n-1

[ 1 0 ]

이 식을 이용하여 피보나치 수를 구할 수 있다.

행렬의 거듭제곱은 분할 정복 기법을 사용하여 O(logN) 시간에 구할 수 있다.

따라서 피보나치 수를 구하는 시간 복잡도는 O(logN)이 된다.

출력은 1,000,000,007로 나눈 나머지를 출력한다.

Rate article
Add a comment

five × four =