fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define endl '\n'
  6.  
  7. const int base=1000000000+7;
  8.  
  9. struct Matrix{
  10. int a[2][2]={0};
  11. };
  12.  
  13. Matrix One(){
  14. Matrix res;
  15. res.a[0][0]=1;res.a[0][1]=0;
  16. res.a[1][0]=0;res.a[1][1]=1;
  17. return res;
  18. }
  19.  
  20. Matrix Nhan(Matrix x, Matrix y){
  21. Matrix res;
  22. for(int i=0;i<2;i++)
  23. for(int j=0;j<2;j++){
  24. res.a[i][j]=0;
  25. for(int t=0;t<2;t++)
  26. res.a[i][j]=(res.a[i][j]+x.a[i][t]*y.a[t][j])%base;
  27. }
  28. return res;
  29. }
  30.  
  31. Matrix LuyThua(Matrix x,int n){
  32. Matrix res=One();
  33. while(n>0){
  34. if (n%2==1) res=Nhan(res,x);
  35. x=Nhan(x,x);
  36. n=n/2;
  37. }
  38. return res;
  39. }
  40.  
  41. int n;
  42. int kq;
  43.  
  44. int32_t main()
  45. {
  46. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  47. cin>>n;
  48. if (n==1 || n==2){
  49. cout<<1<<endl;
  50. return 0;
  51. }
  52.  
  53. Matrix tmp; // tmp=[f(2), f(1)]
  54. tmp.a[0][0]=1;tmp.a[0][1]=1;
  55.  
  56. Matrix X;
  57. X.a[0][0]=1;X.a[0][1]=1;
  58. X.a[1][0]=1;X.a[1][1]=0;
  59.  
  60. // [F(n), F(n-1)] = [F(2), F(1)] * X^(n-2)
  61. X=LuyThua(X,n-2);
  62. tmp=Nhan(tmp,X);
  63. kq=tmp.a[0][0];
  64.  
  65. cout<<kq<<endl;
  66. return 0;
  67. }
Success #stdin #stdout 0.01s 5288KB
stdin
5
stdout
5