輸入一個n*n的矩陣,若可逆,求其逆矩陣。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 405;
const int mod=1e9+7;
int n;
struct Matrix
{
int a[maxn][maxn];
inline void clr(){memset(a,0,sizeof(a));}
int* operator [](int x){return a[x];}
void SWAP(int x,int y){for(int i=1;i<=n;++i)swap(a[x][i],a[y][i]);}
//交換某兩行
void MUL(int x,int k){for(int i=1;i<=n;++i)a[x][i]=(1ll*a[x][i]*k%mod+mod)%mod;}
//將某一行的所有元素乘上k
void MD(int x,int y,int k){for(int i=1;i<=n;++i)a[x][i]=((a[x][i]+(1ll*a[y][i]*k%mod))%mod+mod)%mod;}
//將某一行的所有元素乘上k加到另一行去
void print()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)printf("%d ",a[i][j]);
puts("");
}
}
}A,B;
long long qpow(int a,int b=mod-2)
{
long long ans = 1;
while(b)
{
if(b&1) ans = (ans%mod*1LL*a%mod)%mod;
b>>=1;
a = (1LL*a%mod*1LL*a%mod)%mod;
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
scanf("%d",&A[i][j]);
}
}
for(int i=1;i<=n;++i) B[i][i]=1;
for(int i=1;i<=n;++i)
{
//消成上三角矩陣
if(!A[i][i])
{
for(int j=i+1;j<=n;++j)
{
if(A[j][i])
{
A.SWAP(i,j),B.SWAP(i,j);
break;
}
}
}
if(!A[i][i]) return puts("No Solution"),0;
//如果消着消着某一列沒有數了,說明無解
B.MUL(i,qpow(A[i][i])),A.MUL(i,qpow(A[i][i]));
for(int j=i+1;j<=n;++j)
{
B.MD(j,i,-A[j][i]);
A.MD(j,i,-A[j][i]);
}
}
//消成對角矩陣
for(int i=n-1;i;--i)
{
for(int j=i+1;j<=n;++j)
{
B.MD(i,j,-A[i][j]);
A.MD(i,j,-A[i][j]);
}
}
B.print();
return 0;
}