矩陣快速冪


矩陣乘法:
  行列式的概念:矩陣A=n*m,則稱n為行,m為列。
  矩陣乘法的要求:A*B時:A=n*k,B=k*m。A的列等於B的行。新矩陣=n*m。
  新矩陣第n行,第m列的元素=A的第n行元素*B的第m列元素的乘積的和。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod=1e9+7;
struct mat{
    ll a[2][2];
};
mat matc(mat x,mat y){
    mat res;
    memset(res.a,0,sizeof(res.a));//important
    for(int i=0;i<2;i++)
       for(int j=0;j<2;j++)
          for(int k=0;k<2;k++)
               res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
    return res;           
}
inline int pow(int n){
    mat c,res;
    memset(res.a,0,sizeof(res.a));
    c.a[0][0]=1; c.a[0][1]=1;
    c.a[1][0]=1; c.a[1][1]=0;
    for(int i=0;i<n;i++) res.a[i][i]=1;//單位矩陣 
    while(n){
        if(n&1) res=matc(res,c);
        c=matc(c,c);
        n>>=1;
    }
    return res.a[0][1];
}
int main(){
    int n;
    scanf("%d",&n);
    cout<<pow(n);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM