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