【矩陣】備用模板


來自學長的矩陣模板


#include <cstdio>
struct Mat {
	int N,M;
	int m[15][15];
};
// 有時由於內存的關係無需用結構體,直接定義多組數組即可 
Mat MatMul(Mat A,Mat B,int MOD) { //兩個相等矩陣的乘法,對於稀疏矩陣,有0處不用運算的優化
	Mat tmp;
	tmp.N=A.N;
	tmp.M=B.M;
	for(int i=0; i<A.N; i++) {
		for(int j=0; j<B.M; j++) {
			int sum=0;
			for(int k=0; k<B.N; k++)
				sum=(sum+A.m[i][k]*B.m[k][j])%MOD;
			tmp.m[i][j]=sum;
		}
	}
	/*
	    for(int i = 0; i < N; i++) {
	            for(int j = 0; j < m; j++) {
	                c[i][j] = 0;
	            }
	    }
	    for(int i = 0; i < N; i++) {
	        for(int k = 0; k < M; k++) {
	            if(a[i][k] == 0) continue;
	            for(int j = 0; j < m; j++) {
	                c[i][j] += a[i][k] * b[k][j];
	            }
	        }
	    }
	*/
	return tmp;
}
Mat MatPow(Mat mat,int n,int MOD) { //二分快速冪
	Mat ans;
	ans.N=ans.M=mat.N;
	for(int i=0; i<ans.N; i++)
		ans.m[i][i]=1;
	while(n) {
		if(n&1)
			ans=MatMul(ans,mat,MOD);
		mat=MatMul(mat,mat,MOD);
		n>>=1;
	}
	return ans;
}
int main() {
	Mat a,b;
	int n,m;
	scanf("%d %d",&n,&m);
	a.N=n;
	a.M=m;
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++) {
			scanf("%d",&a.m[i][j]);
		}
	scanf("%d %d",&n,&m);
	b.N=n;
	b.M=m;
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
			scanf("%d",&b.m[i][j]);
	Mat res;
	res=MatMul(a,b,10000000);
	for(int i=0; i<res.N; i++) {
		for(int j=0; j<res.M; j++) {
			printf("%d%c",res.m[i][j],j==res.M-1?'\n':' ');
		}
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章