【矩陣乘法】Matrix Power Series

SSL_HKY發表於2020-12-19

Link-PKU3233———————


題目大意

給出一個矩陣 A A A,求矩陣 S = A + A 2 + A 3 . . . . . . A k S=A+A^2+A^3......A^k S=A+A2+A3......Ak. 並模上一個數m

輸入

第一行 n , k , m n,k,m nkm
接下來讀入矩陣 A A A

輸出

矩陣 S S S


矩陣乘法

如果A是一個數的情況,那我們可以得到這樣一個矩陣:

同理。我們只要把其中的數字替換成一個矩陣即可。

其中,1替換為單位矩陣E。即左上到右下的斜角線為1,其餘都為0的矩陣。

即,對於一個數k,有 ( k ∗ 1 = 1 ∗ k = k ) (k*1=1*k=k) (k1=1k=k)
而,對於一個矩陣A,有 ( A ∗ E = E ∗ A = A ) (A*E=E*A=A) (AE=EA=A).
最後答案中會多一個E出來(最開始的E),減去即可。


程式碼

#include<cstdio>
int n,m,k;
struct asdf{
	int n,m,jz[100][100];
} A,B,C;
asdf operator *(asdf aa, asdf bb){
	asdf cc;
	cc.n = aa.n; 
	cc.m = bb.m;
	for(int i = 1; i <= cc.n; ++i)
	  for(int j = 1 ;j <= cc.m; ++j)
	    cc.jz[i][j] = 0;
	for(int l = 1; l <= aa.m; ++l)
	  for(int i = 1; i <= cc.n; ++i)
	    for(int j = 1; j <= cc.m; ++j)
		  cc.jz[i][j] = (cc.jz[i][j] + aa.jz[i][l] * bb.jz[l][j] % m) % m;
	return cc; 
}
void ksm(int now){
	C = B;
	while (now) {
		if (now & 1) C = C * B;
		B = B * B;
		now /= 2;
	}
}
int main(){
	scanf("%d%d%d",&n,&k,&m);
	A.n = A.m = n;
	for(int i = 1; i <= n; ++i){
		for(int j = 1; j <= n; ++j)
	    scanf("%d",&A.jz[i][j]);
	}
	B.n = B.m = 2*n;
	for(int i = 1; i <= n; ++i){
		B.jz[i][i+n] = B.jz[i+n][i+n] = 1;
		for(int j = 1; j <= n; ++j)
		  B.jz[i][j] = A.jz[i][j] % m;
	}
	ksm(k);
	for(int i = 1; i <= n; ++i){
		for(int j = 1; j <= n; ++j){
			if(i == j) printf("%d ",(C.jz[i][j+n]+m-1) % m);
			else printf("%d ",C.jz[i][j+n]);
		}
			
		printf("\n");
	}
} 

相關文章