P4783 【模板】矩阵求逆 题解
Satellite_system · · 题解
题面解释:
给出矩阵
思路分析:
前置知识:高斯消元。
逆矩阵是什么呢?我们知道
所以对比数的式子,有
高斯消元后直接输出即可,判断无解的方式也不变。
AC Code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=810,mod=1e9+7;
int n,a[N][N];
int qpow(int x,int y){
int res=1;
while(y){
if(y&1)res=res*x%mod;
x=x*x%mod,y>>=1;
}
return res;
}
void gauss(){
for(int i=1,k=1;i<=n;k=++i){
for(int j=i+1;j<=n;j++)
if(a[j][i])k=j;
for(int j=1;j<=2*n;j++)
swap(a[i][j],a[k][j]);
if(!a[i][i])return printf("No Solution"),void();
for(int j=1,tmp=a[i][i];j<=2*n;j++)
a[i][j]=a[i][j]*qpow(tmp,mod-2)%mod;
for(int k=1;k<=n;k++)if(k!=i)
for(int l=1,tmp=a[k][i];l<=2*n;l++)
a[k][l]=(a[k][l]-a[i][l]*tmp%mod+mod)%mod;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cout<<a[i][j+n]<<" \n"[j==n];
return;
}
signed main(){
cin>>n;
for(int i=1;i<=n&&(a[i][i+n]=1);i++)
for(int j=1;j<=n;j++)cin>>a[i][j];
gauss();
return 0;
}
完结撒花!!!