【51Nod】1242 斐波那契数列的第N项

来源:互联网 发布:计算机编程与维护 编辑:程序博客网 时间:2024/06/07 04:54

题意

斐波那契数列的定义如下:
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(n1)]=[1110][F(n1)F(n2)]=[1110]n1[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;  }  
阅读全文
0 0
原创粉丝点击