斐波那契数列

第n项为n个{1,1,1,0}矩阵相乘结果的首项。由于结果可能很大,故已经取余。
#include<iostream>
using namespace std;
typedef long long LL;
const LL mod=1000000009;
const int Q=2;
struct matrix
{
    LL a[Q][Q];
};
matrix base={1,1,1,0},one={1,0,0,1};
matrix m_multi(matrix M,matrix N)
{
	matrix A;
	for(int i=0;i<Q;i++)
	{
		for(int j=0;j<Q;j++)
		{
			A.a[i][j]=0;
			for(int k=0;k<Q;k++)
			{
				A.a[i][j]+=M.a[i][k]*N.a[k][j]%mod;
			}
			A.a[i][j]%=mod;
		}
	}
	return A;
}
matrix m_power(matrix M ,LL n)//斐波那契数列n项为矩阵(1,1,1,0)的n次方的第一元素
{
	matrix Mn=base,out=one;
	if(n==0)
	{
		return base;
	}
	while(n)
	{
		if(n&1)
		{
		    out=m_multi(out,Mn);
		}
		n>>=1;
	    Mn=m_multi(Mn,Mn);
	}
	return out;
}
int main()
{
	LL n;
    cin>>n;
	if(n==2||n==1)
		cout<<1;
	else
	{ 
	    cout<<m_power(base,n-1).a[0][0]%mod;
	}
	return 0;
}

你可能感兴趣的:(斐波那契数列)