关于矩阵的相关运算
定义
肥肠的简单
即将矩阵作为一个整体进行加减乘(包括快速幂)等的运算操作
对,没有除
至于为什么我不会告诉你是因为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();
}