[板子]矩阵快速幂求解斐波那契

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;
}

 

以上是关于[板子]矩阵快速幂求解斐波那契的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]

斐波那契矩阵快速幂模板斐波那契公约数

P1962 斐波那契数列 矩阵快速幂

[P1962] 斐波那契数列 (矩阵快速幂)

快速求斐波那契数列(矩阵乘法+快速幂)

从斐波那契到矩阵快速幂