关于矩阵的相关运算

定义

肥肠的简单
即将矩阵作为一个整体进行加减乘(包括快速幂)等的运算操作

对,没有除
至于为什么我不会告诉你是因为huge没有讲的

不过对于除法我们可以通过增广原除数矩阵再进行高斯消元balabala的操作求得除数矩阵逆矩阵
再将被除数矩阵乘上除数矩阵逆矩阵得到ans矩阵

我们可以将矩阵定义为结构体
通过重载运算符来实现矩阵的加减乘

矩阵快速幂就和普通的快速幂没什么两样
毕竟已经重载了运算符嘛

模板

Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N = 105;
int mod=1e14;
struct Mat{
	int n,m;//行列
	int a[N][N];
	void clean(){
		mst(a,0);
	}
	
	//n*n的单位矩阵
	void unit(){ 
		clean();
		for(int i=1;i<=n;i++){
			a[i][i]=1;
		}
	}
	
	//设置矩阵大小
	void resize(int x,int y){ 
		n=x,m=y;
	}
	
	//矩阵加
	Mat operator + (const Mat &A) const{ 
		Mat res;
		res.resize(n,m);
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=(a[i][j]+A.a[i][j])%mod;
			}
		}
		return res;
	}
	
	//矩阵减 
	Mat operator - (const Mat &A) const { 
		Mat res;
		res.resize(n,m);
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=(a[i][j]-A.a[i][j])%mod;
			}
		}
		return res;
	}
	
	//矩阵乘
	Mat operator * (const Mat &A) const { 
		Mat res;
		res.resize(n,A.m);
		res.clean();
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=A.m;j++){
				for(int k=1;k<=m;k++){
					res.a[i][j]=(a[i][k]*A.a[k][j]+res.a[i][j])%mod;
				}
			}
		}
		return res;
	}
	
	//输出矩阵
	void output(){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%lld ",a[i][j]);
			}
			putchar('\n');
		}
	} 
};

//矩阵快速幂 
Mat qpow(Mat A,int b){
	Mat res;
	res.resize(2,2);
	res.unit();
	while(b){
		if(b&1){
			res=res*A;
		}
		A=A*A;
		b>>=1; 
	}
	return res;
} 

signed main(){
	int x,y,a,b;
	Mat A,B,ans;
	cin>>x>>y;
	A.resize(x,y);
	for(int i=1;i<=x;i++){
		for(int j=1;j<=y;j++){
			cin>>A.a[i][j];
		}
	}
	cin>>a>>b;
	B.resize(a,b);
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			cin>>B.a[i][j];
		}
	}
	ans=A*B;
	ans.output();
}
posted @ 2024-03-15 11:42  Elaina_0  阅读(23)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end