题意
斐波那契数列的定义如下:
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的结果即可。
解题思路
[F(n)F(n−1)]=[1110]∗[F(n−1)F(n−2)]=[1110]n−1∗[10]
然后采用矩阵快速幂即可。
参考代码
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
typedef long long ll;
struct Matrix{
ll mat[2][2];
};
Matrix mul(Matrix a,Matrix b,ll mod){
Matrix ans;
for (int i=0;i<2;i++){
for (int j=0;j<2;j++){
ans.mat[i][j]=0;
for (int k=0;k<2;k++){
ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[k][j]);
ans.mat[i][j]%=mod;
}
}
}
return ans;
}
Matrix Init(){
Matrix ans;
for (int i=0;i<2;i++){
for (int j=0;j<2;j++){
if (i==j)
ans.mat[i][j]=1;
else
ans.mat[i][j]=0;
}
}
return ans;
}
Matrix exp(Matrix a,ll k,ll m){
Matrix ans=Init();
while (k){
if (k&1)
ans=mul(ans,a,m);
a=mul(a,a,m);
k>>=1;
}
return ans;
}
int main(){
Matrix M;
ll n;
ll m=1000000009;
while (~scanf("%lld",&n)){
M.mat[0][0]=1;
M.mat[1][1]=0;
M.mat[0][1]=1;
M.mat[1][0]=1;
Matrix ans=exp(M,n-1,m);
ll x=ans.mat[0][0];
cout<<x<<endl;
}
return 0;
}