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;
}

浙公网安备 33010602011771号