1def multiply(m1, m2):
2 result = [0, 0, 0, 0]
3 result[0] = (m1[0]*m2[0] + m1[1]*m2[2]) % 1000000007
4 result[1] = (m1[0]*m2[1] + m1[1]*m2[3]) % 1000000007
5 result[2] = (m1[2]*m2[0] + m1[3]*m2[2]) % 1000000007
6 result[3] = (m1[2]*m2[1] + m1[3]*m2[3]) % 1000000007
7 return result
8
9def power(m, n):
10 if (n > 1):
11 m = power (m, n//2)
12
13 m = multiply (m, m)
14 if n % 2 == 1:
15 m = multiply(m, [1,1,1,0])
16 return m
17
18N = int(input())
19
20mat = power ([1,1,1,0], N)
21print (mat[1]%1000000007)
문제
-
n이 주어질 때 n번째 피보나치 수를 구하여라.
-
이때 n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.
-
TC
- input
1000
- ouput
517691607
- input
해결방법
- 행렬의 거듭제곱을 이용해여 피보나치 수를 구하였다
- 공식은 다음과 같다
$$ \begin{bmatrix}F*{n+1} & F*{n} \\ F*{n} & F*{n-1} \ \end{bmatrix} = \begin{bmatrix}1&1 \\ 1&0 \\ \end{bmatrix} ^n$$
- 홀수인 경우 한번 더 곱해주어야 한다는 것을 고려하여 분할 정복 방식으로 해결하였다