1. 程式人生 > 實用技巧 >學習筆記--矩陣乘法

學習筆記--矩陣乘法

定義

數有數的乘法,矩陣乘上矩陣就叫做矩陣乘法

在數學上,我們這樣定義矩陣乘法

(摘自百度百科)

性質

對應行一一對應乘以對應列,最後得到的加權之和就是運算的結果

矩陣快速冪:因為矩陣乘法具有結合律,所以可以使用快速冪,那麼這個過程我們就稱之為矩陣快速冪

應用

矩陣快速冪一般用於加速線性遞推\((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;
}