设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=E ,则我们称B是A的逆矩阵,而A则被称为可逆矩阵。注:E为单位矩阵。
注意矩阵和行列式是不一样的 行列式是可以计算的
/*
落谷:p4783
求一个N\times NN×N的矩阵的逆矩阵。答案对10^9+7取模。
*/
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
typedef long long LL;
const int N=405;
const LL mod=1e9+7;
int n,m;
LL a[N][N<<1];
LL ksm(LL u,LL v){ //求逆元
LL ans=1;
while(v){
if(v&1)ans=ans*u%mod;
u=u*u%mod;v>>=1;
}
return ans;
}
void Gauss()
{
for(int i=1;i<=n;i++){//枚举列
int maxn=i;
for(int j=i+1;j<=n;j++){//选择一个当前位置系数绝对值最大的调换过来,防止误差
if(abs(a[j][i])>abs(a[j][maxn])){
maxn=j;
}
}
for(int j=1;j<=n+1;j++){//把第i列最大的系数放到第i行
swap(a[i][j],a[maxn][j]);
}
if(!a[i][i]){//如果该位置系数等于零,则0x=a,一定无解
printf("No Solution\n");
exit(0);
}
LL t=ksm(a[i][i],mod-2);
for(int j=i;j<=m;j++){
a[i][j]=a[i][j]*t%mod;
}
for(int j=1;j<=n;j++){
if(i!=j){
t=a[j][i];
for(int k=i;k<=m;k++){
a[j][k]=(a[j][k]-t*a[i][k]%mod+mod)%mod;//将其他方程用加减法减去系数值
}
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
}
a[i][n+i]=1;
}
m=n*2;
Gauss();
for(int i=1;i<=n;i++){
for(int j=n+1;j<=m;j++){
printf("%lld ",a[i][j]);
}
printf("\n");
}
return 0;
}