代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
const ll mod=998244353;
const int N=2e5+10;
#define int ll
const double eps=1e-6;
double a[200][200];
int n;
bool gauss(){
for(int i=1;i<=n;i++){//枚举行列 ,枚举i,i对角线位置
int r=i;
for(int k=i;k<=n;k++)//找非0行
if(fabs(a[k][i])>eps){
r=k;break;
}
if(r!=i) swap(a[r],a[i]);//换行
if(fabs(a[i][i])<eps) return 0;
for(int j=n+1;j>=i;j--)//变 1
a[i][j]/=a[i][i];
for(int k=i+1;k<=n;k++)//变 0
for(int j=n+1;j>=i;j--)
a[k][j]-=a[k][i]*a[i][j];
}
for(int i=n-1;i>=1;i--)//回带
for(int j=i+1;j<=n;j++)//到第i行的时候,i+1列到n列的值一定都已经求好了
a[i][n+1]-=a[i][j]*a[j][n+1];//这些列的值对应在相应的行的n+1列位置
return 1;//唯一解 i+1列的值在【i+1】【n+1】
}
bool gauss_jordan(){
for(int i=1;i<=n;i++){//枚举行列 ,枚举i,i对角线位置
int r=i;
for(int k=i;k<=n;k++)//找非0行
if(fabs(a[k][i])>eps){
r=k;break;
}
if(r!=i) swap(a[r],a[i]);//换行
if(fabs(a[i][i])<eps) return 0;
for(int k=1;k<=n;k++){//对角化
if(k==i) continue;
double t=a[k][i]/a[i][i];
for(int j=i;j<=n+1;j++)
a[k][j]-=t*a[i][j];
}
}
for(int i=1;i<=n;i++)
a[i][n+1]/=a[i][i];
return 1;//唯一解
}
bool gauss_jordan_ni(){
for(int i=1;i<=n;i++){//枚举行列 ,枚举i,i对角线位置
int r=i;
for(int k=i;k<=n;k++)//找非0行
if(fabs(a[k][i])>eps){
r=k;break;
}
if(r!=i) swap(a[r],a[i]);//换行
if(fabs(a[i][i])<eps) return 0;
for(int k=1;k<=n;k++){//对角化
if(k==i) continue;
double t=a[k][i]/a[i][i];
for(int j=i;j<=2*n;j++)
a[k][j]-=t*a[i][j];
}
for(int j=n*2;j>=i;j--)
a[i][j]/=a[i][i];
}
return 1;//唯一解
}
void solve(){
cin>>n;
for(int i=1;i<=n*2;i++){
for(int j=1;j<=n*2;j++)
a[i][j]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
for(int i=1;i<=n;i++)
a[i][i+n]=1;
if(gauss_jordan_ni()==0){
cout<<"No Solution";
}
else{
for(int i=1;i<=n;i++){
for(int j=n+1;j<=n*2;j++){
if(j>n+1) cout<<' ';
cout<<fixed<<setprecision(2)<<a[i][j];
}
cout<<endl;
}
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while (t--){
solve();
}
return 0;
}