基准时间限制: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
思路:n的范围过大,暴力超时
矩阵快速幂
https://blog.csdn.net/y990041769/article/details/22311889
#include<bits/stdc++.h>
#define INF 1000000009
using namespace std;
struct Mat
{
long long a[2][2];
};
Mat mul(Mat A,Mat B)
{
Mat temp;
int i,j;
memset(temp.a,0,sizeof(temp.a));
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
for(int k=0;k<2;k++)
temp.a[i][j]=(temp.a[i][j]+A.a[i][k]*B.a[k][j])%INF;
}
}
return temp;
}
Mat del(Mat ans,long long n)
{
Mat num={1,0,0,1};
while(n)
{
if(n&1)
num=mul(num,ans);
ans=mul(ans,ans);
n>>=1;
}
// for(int i=0;i<2;i++)
// {
// for(int j=0;j<2;j++)
// cout<<num.a[i][j]<<" ";
// cout<<endl;
// }
return num;
}
int main()
{
long long n;
cin>>n;
Mat C={1,1,1,0};
C=del(C,n);
cout<<C.a[0][1]<<endl;
return 0;
}