[板子]矩阵快速幂求解斐波那契
Posted FySeA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[板子]矩阵快速幂求解斐波那契相关的知识,希望对你有一定的参考价值。
在斐波那契数列之中
f[i] = 1*f[i-1]+1*f[i-2] f[i-1] = 1*f[i-1] + 0*f[i-2];
即
所以
就这两幅图完美诠释了斐波那契数列如何用矩阵来实现。
摘自:http://blog.csdn.net/nyist_tc_lyq/article/details/52981353
#include<bits/stdc++.h> #define LL long long using namespace std; const long long pi=1000000007; struct node{ long long a[3][3]; }t1; long long n,k; node X(node x,node y){ node box; for(LL i=1;i<=2;i++){ for(LL j=1;j<=2;j++){ box.a[i][j]=0; } } for(LL i=1;i<=2;i++){ for(LL j=1;j<=2;j++){ for(LL k=1;k<=2;k++){ box.a[i][j]=(box.a[i][j]+(x.a[i][k]*y.a[k][j])%pi)%pi; } } } return box; } void power(long long kk){ node ans; kk-2; ans.a[1][1]=1;ans.a[1][2]=1; ans.a[2][1]=1;ans.a[2][2]=0; while(kk!=0){ if(kk&1==1){ ans=X(ans,t1); } kk>>=1; t1=X(t1,t1); } cout<<ans.a[2][2]<<endl; } int main(){ cin>>n; if(n==0) cout<<"0"<<endl; else if(n==1||n==2) cout<<"1"<<endl; else{ t1.a[1][1]=1;t1.a[1][2]=1; t1.a[2][1]=1;t1.a[2][2]=0; power(n); } return 0; }
以上是关于[板子]矩阵快速幂求解斐波那契的主要内容,如果未能解决你的问题,请参考以下文章