斐波那契数列的定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。
Input
输入1个数n(1 <= n <= 10^18)。
Output
输出F(n) % 1000000009的结果。
Input示例
11
Output示例
89
N<= 10^18,这明显不能直接暴力了,要构造矩阵运算,构造矩阵运算是为了使用矩阵快速幂。
F(n) = F(n - 1) + F(n - 2) ,看了这条公式,第一想到的就是矩阵两个1。
矩阵1: f[n] , 0 乘矩阵2: 1 , 1 等于 f[n]+f[n-1], 0
f[n-1] , 0 1 , 0 f[n] , 0
发现了吗,乘了以后第一个就成了递推的下一个,归纳可得,乘i次就是 f[n+i]。
变为这种矩阵的形式就是为了不断自乘矩阵2,这样就能用矩阵快速幂的方法解决题目。
代码献上:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int main()
{
long long int n;
while(cin>>n)
{
long long int a[2][2]={1,1,1,0},b[2][2]={1,0,0,0},t1,t2,t3,t4;
n-=1;
while(n>0)
{
if(n&1)
{
t1=(a[0][0]*b[0][0]+a[0][1]*b[1][0])%1000000009;
t2=(a[0][0]*b[0][1]+a[0][1]*b[1][1])%1000000009;
t3=(a[1][0]*b[0][0]+a[1][1]*b[1][0])%1000000009;
t4=(a[1][0]*b[0][1]+a[1][1]*b[1][1])%1000000009;
b[0][0]=t1;
b[0][1]=t2;
b[1][0]=t3;
b[1][1]=t4;
}
n=n>>1;
t1=(a[0][0]*a[0][0]+a[0][1]*a[1][0])%1000000009;
t2=(a[0][0]*a[0][1]+a[0][1]*a[1][1])%1000000009;
t3=(a[1][0]*a[0][0]+a[1][1]*a[1][0])%1000000009;
t4=(a[1][0]*a[0][1]+a[1][1]*a[1][1])%1000000009;
a[0][0]=t1;
a[0][1]=t2;
a[1][0]=t3;
a[1][1]=t4;
}
cout<<b[0][0]<<endl;
}
return 0;
}