1. 程式人生 > >矩陣快速冪斐波那契數列

矩陣快速冪斐波那契數列

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
const ll M=1e11+7;

mat mul(mat &A,mat &B){
    mat c(A.size(),vec(B[0].size()));
    for(int i=0;i<A.size();i++){
        for(int k=0;k<B.size();k++){
            for(int j=0;j<B[0].size();j++){
                c[i][j]=((c[i][j]+A[i][k]*B[k][j])%M+M)%M;
            }
        }
    }
    return c;
}
mat pow(mat A ,ll n){
    mat B(A.size(),vec(A.size()));
    for(int i=0;i<A.size();i++){
        B[i][i]=1;
    }
    while(n>0){
        if(n&1){
            B=mul(B,A);
        }
        A=mul(A,A);
        n>>=1;
    }
    return B;
}
int main(){
    ll n;
    for(int i=1;i<=10;i++){
        n=i;
		mat A(2,vec(2));
		A[0][0]=1;A[0][1]=1;
		A[1][0]=1;A[1][1]=0;
		A=pow(A,n);
        //	printf("%d\n",A[1][0]);
    ll ret=A[0][1];
		cout<<ret<<endl;
    }
	
	return 0;
}