1242 斐波那契数列的第N项
斐波那契数列的定义如下:
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的结果即可。
收起
输入
输入1个数n(1 <= n <= 10^18)。
输出
输出F(n) % 1000000009的结果。
输入样例
11
输出样例
89
斐波那契数列的通项遵循以下规则
#include <iostream>
#define maxn 1000000009
typedef long long ll;
using namespace std;
class Matrix{
public:
ll F[2][2];
Matrix();
Matrix(int a);
};
Matrix::Matrix(){
F[0][0]=1;
F[0][1]=1;
F[1][0]=1;
F[1][1]=0;
}
Matrix::Matrix(int a){
F[0][0]=0;
F[0][1]=0;
F[1][0]=0;
F[1][1]=0;
}
//矩阵乘法 i,j; i,k; k,j;
Matrix MatrixMutiply(Matrix *A , Matrix *B){
Matrix a(0);
for(int i=0; i<2 ;++i){
for(int j=0; j<2 ;++j){
for(int k=0; k<2 ;++k){
a.F[i][j]=(a.F[i][j]+(A->F[i][k]*B->F[k][j])%maxn)%maxn;
}
}
}
return a;
}
int main()
{
ll n;
cin>>n;
Matrix C,D;
C.F[0][0]=1;
C.F[0][1]=0;
C.F[1][0]=0;
C.F[1][1]=1;
while(n!=0){
if(n%2==1){
C=MatrixMutiply(&C,&D); //普通快速幂,将因子改为矩阵的形式
}
D=MatrixMutiply(&D,&D);
n=n>>1;
}
cout<<C.F[0][1]<<endl;
return 0;
}