學習筆記--矩陣乘法
阿新 • • 發佈:2020-12-06
定義
數有數的乘法,矩陣乘上矩陣就叫做矩陣乘法
在數學上,我們這樣定義矩陣乘法
(摘自百度百科)
性質
對應行一一對應乘以對應列,最後得到的加權之和就是運算的結果
矩陣快速冪:因為矩陣乘法具有結合律,所以可以使用快速冪,那麼這個過程我們就稱之為矩陣快速冪
應用
矩陣快速冪一般用於加速線性遞推\((DP)\),如:斐波那契數列
對於矩陣快速冪加速\(DP\),我們一般可以分成這幾個步驟:
第一步:完成普通做法的\(DP\)
第二步:設計狀態矩陣
*第三步:根據轉移過後的結果求最終答案
(其實第三步也算是沒有)
那麼我們的重點在第二步:如何設計狀態轉移矩陣?
首先,我們要知道\(DP\)方程當中的項數,一般來說有多少項就記錄多少個(就是矩陣的大小)
然後對於每一項,我們直接按照矩陣乘法的規則填上轉移的係數就可以了
然後就可以愉快的使用矩陣快速冪了
程式碼
給個常用的板子吧
const int N=105,MOD=1e9+7; int n,m; #define inc(a,b) (a+b>=MOD?a+b-MOD:a+b) struct Matrix{ int a[N][N]; Matrix(){memset(a,0,sizeof(a));} Matrix operator *(Matrix B){ Matrix C; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ C.a[i][j]=inc(C.a[i][j],a[i][k]*B.a[k][j]%MOD); } } } return C; } }; Matrix QuickPow(Matrix A,int y){ Matrix res; for(int i=1;i<=n;i++) res.a[i][i]=1; while(y){ if(y&1) res=res*A; A=A*A; y>>=1; } return res; }