求一个N×N的矩阵的逆矩阵。答案对10^9+7取模。
输入格式
第一行有一个整数NN,代表矩阵的大小;
从第22行到第N+1行,每行N个整数,其中第i+1行第j列的数代表矩阵中的元素 aij。
输出格式
若矩阵可逆,则输出N行,每行N个整数,其中第ii行第jj列的数代表逆矩阵中的元素 bij,答案对10^9+7取模;否则只输出一行 No Solution。
输入
3
1 2 8
2 5 6
5 1 2
输出
718750005 718750005 968750007
171875001 671875005 296875002
117187501 867187506 429687503
输入
3
3 2 4
7 2 9
2 4 3
输出
No Solution
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f,mod=1e9+7,MAXN=5;
ll qpow(ll x,ll k){
ll res=1;
while(k){
if(k&1)res=res*x%mod;
x=x*x%mod;k>>=1;
}return res;
}
ll a[MAXN][MAXN<<1];
int n;
bool gauss(){//求矩阵的逆,a换成a[MAXN][MAXN+1]则求解方程的解。
for(int i=1,r=1;i<=n;r=++i){
for(int j=i+1;j<=n;++j)if(a[j][i]>a[r][i])r=j;//找第i行下面第i列最大的元素
if(a[r][i]==0)return 0;//最大元素==0,矩阵非奇异
if(i^r)for(int j=1;j<=n<<1;++j)swap(a[i][j],a[r][j]);//交换r,i行
ll inv=qpow(a[i][i],mod-2);//第i,i个元素的逆元
for(int j=i;j<=n<<1;++j)a[i][j]=inv*a[i][j]%mod;
//第i行其他元素除以第i,i个元素
for(int k=1;k<=n;++k){//第k行
if(k==i)continue;
ll p=a[k][i];//不能带入,因为j==i时把a[k][i]改了
//row(j)减去p*row(i)
for(int j=i;j<=n<<1;++j)a[k][j]=(a[k][j]-p*a[i][j]%mod+mod)%mod;
}
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
a[i][n+i]=1;//单位矩阵
for(int j=1;j<=n;++j)scanf("%lld",&a[i][j]);
}
if(!gauss())printf("No Solution");
else for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)printf("%lld ",a[i][n+j]);
printf("\n");
}
return 0;
}