51 nod 1242 斐波那契数列的第N项(矩阵快速幂)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值