矩陣快速冪斐波那契數列
阿新 • • 發佈:2018-12-24
#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; }