#include<cstdio>
#include<cstring>
#include<iostream>
const int mod=1e9+9;
using namespace std;
typedef long long LL;
LL n;
struct Matrix
{
LL mat[2][2];
Matrix operator -(Matrix &tmp)
{
Matrix res;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
{
res.mat[i][j]=mat[i][j]-tmp.mat[i][j]+mod;
res.mat[i][j]%=mod;
}
return res;
}
Matrix operator *(Matrix &tmp)
{
Matrix res;
memset(res.mat,0,sizeof(res.mat));
for(int i=0; i<2; ++i)
for(int j=0; j<2; ++j)
for(int k=0; k<2; ++k)
{
res.mat[i][j]+=mat[i][k]*tmp.mat[k][j];
res.mat[i][j]%=mod;
}
return res;
}
};
Matrix pow_M(Matrix a,LL n)
{
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
ret.mat[0][0]=ret.mat[1][1]=1;
Matrix temp=a;
while(n)
{
if(n&1)ret=ret*temp;
temp=temp*temp;
n>>=1;
}
return ret;
}
LL pow_m(LL a,LL n)
{
LL ret=1;
LL temp=a%mod;
while(n)
{
if(n&1)
{
ret*=temp;
ret%=mod;
}
temp*=temp;
temp%=mod;
n>>=1;
}
return ret;
}
int main()
{
while(~scanf("%I64d",&n))
{
if(n==1)
{
printf("1\n");
continue;
}
Matrix A,B;
A.mat[0][0]=1;
A.mat[0][1]=1;
A.mat[1][0]=1;
A.mat[1][1]=0;
B=pow_M(A,n-1);
printf("%I64d\n",(B.mat[0][0])%mod);
}
}
51nod1242 斐波那契数列的第N项(矩阵)
最新推荐文章于 2019-08-05 11:04:19 发布