码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-10 01:39:23      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:b2c   i++   分享   none   img   技术分享   size   for   .net   

在斐波那契数列之中

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

 

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

标签:b2c   i++   分享   none   img   技术分享   size   for   .net   

原文地址:http://www.cnblogs.com/Fylsea/p/7812146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!