M斐波那契数列
Problem Description
M斐波那契数列F[n]是一种整数数列,它的定义如下:
F[0] = a
F1 = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
现在给出a, b, n,你能求出F[n]的值吗?
Input
输入包含多组测试数据;
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
Sample Input
0 1 0
6 10 2
Sample Output
0
60
题目解决
题目分析:
- 注意到n的范围最大到10^9,所以简单的进行递推时间和空间上都无法处理到限制范围内.
- 这道题涉及到取余运算,所以我们应该知道取余运算的其中一个性质:
(a∗b)modp=((amodp)∗(bmodp))modp ( a ∗ b ) mod p = ( ( a mod p ) ∗ ( b mod p ) ) mod p
- 注意到该递推式和斐波那契数列有相似之处.
知识点:
1.斐波那契数列的矩阵运算
1.斐波那契数列
fib(0)=0 f i b ( 0 ) = 0
fib(1)=1 f i b ( 1 ) = 1
fib(n)=fib(n−1)+fib(n−2) f i b ( n ) = f i b ( n − 1 ) + f i b ( n − 2 )
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | … | … | n-1 | n |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
fib(n) | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 | 377 | … | … | fib(n-1) | fib(n) |
2.将斐波那契数列写到矩阵中
1.考虑按照以下表达式构造n个矩阵:
2.得到如下矩阵
A0=[0111] A 0 = [ 0 1 1 1 ] A1=[1112] A 1 = [ 1 1 1 2 ] A2=[1223] A 2 = [ 1 2 2 3 ] A3=[2335] A 3 = [ 2 3 3 5 ] A4=[3558] A 4 = [ 3 5 5 8 ] … … …
An=[fib(n)fib(n+1)fib(n+1)fib(n+2)] A n = [ f i b ( n ) f i b ( n + 1 ) f i b ( n + 1 ) f i b ( n + 2 ) ]
3.矩阵乘法运算
A1=[1112]=A0A0 A 1 = [ 1 1 1 2 ] = A 0 A 0 A2=[1223]=A0A0A0 A 2 =