2025/8/26

T2 模板(monica)

这是一道矩阵求逆的题,求矩阵 \(X\) 使得 \(A\times X=B\)。由于 \(A\times A^{-1}=I\),所以 \(X=A^{-1}\times B\) .

所以只需求 \(A^{-1}\),再与 \(B\) 做矩阵乘法并取模就完成了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=410,mod=998244353;
ll a[N][2*N];
vector<ll> q[N];
int ksm(ll a,int b){
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
void Gauss(int n,int m){
	for(register int i=1;i<=n;++i){
		int x=i;
		for(register int j=i+1;j<=n;++j){
			if(a[j][i]>a[x][i]) x=j;
		}
		if(x!=i) swap(a[i],a[x]);
		ll y=ksm(a[i][i],mod-2);
		for(register int j=i;j<=m;++j) a[i][j]=a[i][j]*y%mod;
		for(register int j=1;j<=n;++j){
			if(j==i) continue;
			y=a[j][i];
			for(register int k=1;k<=m;++k) a[j][k]=(a[j][k]-y*a[i][k]%mod+mod)%mod;
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m,r;
	ll x;
	cin>>n>>m;
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=m;++j){
			cin>>a[i][j];
		}
		a[i][n+i]=1;
	}
	Gauss(n,2*n);
	cin>>n>>r;
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=r;++j){
			cin>>x;
			q[i].push_back(x);
		}
	}
	for(register int i=1;i<=n;i++){
		for(register int j=1;j<=n;j++) 
			a[i][j]=a[i][j+n];
	}
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=r;++j){
			x=0;
			for(register int k=1;k<=n;++k) x=(x+a[i][k]*q[k][j-1]%mod)%mod;
			cout<<x<<' ';
		}
		cout<<"\n";
	}
	return 0;
}
posted @ 2025-10-04 21:04  筝小鱼  阅读(8)  评论(0)    收藏  举报