基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
斐波那契数列的定义如下:
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 矩阵快速幂
/*
data:2018.5.13
author:gsw
link:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242
*/
#define ll long long
#define IO ios_with_sync(false); #include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std; ll mod=;
class Matrix
{
public:
ll matrix[][];
};
Matrix a,b,ans; void init()
{
a.matrix[][]=;a.matrix[][]=;a.matrix[][]=;a.matrix[][]=;
b.matrix[][]=;b.matrix[][]=;b.matrix[][]=;b.matrix[][]=;
memset(ans.matrix,,sizeof(ans.matrix));
ans.matrix[][]=;ans.matrix[][]=;
}
Matrix mul(Matrix a1,Matrix a2)
{
Matrix ans;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
ans.matrix[i][j] = ;
for(int k = ; k <; k++)
{
ans.matrix[i][j] +=a1.matrix[i][k]*a2.matrix[k][j]%mod;
ans.matrix[i][j]%=mod;
}
}
}
return ans;
}
void fast_mod(ll n)
{
while (n>)
{
if(n&)ans=mul(ans,a);
a=mul(a,a);
n=n>>;
}
} int main()
{
ll n;
scanf("%lld",&n);
init();
fast_mod(n-);
b=mul(b,ans);
cout<<b.matrix[][]<<endl;
//main();
}