//仅对高斯消元过程中不发生行交换的情况适用。
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int size_n=100;
const double exps=1e-7;
double a[size_n][size_n],L[size_n][size_n],b[size_n],tem[size_n],ans[size_n];
void get_ans2(int n){
for(int i=n;i>=1;--i){
double sum=0;
for(int j=n;j>i;--j){
sum+=ans[j]*a[i][j];
}
ans[i]=(tem[i]-sum)/a[i][i];
}
}
void get_ans1(int n){
for(int i=1;i<=n;++i){
double sum=0;
for(int j=1;j<=i;++j){
sum+=tem[j]*L[i][j];
}
tem[i]=(b[i]-sum)/L[i][i];
}
}
//void get_ans1(int n){
// for(int i=1;i<=n;++i){
// double sum=0;
// for(int j=1;j<i;++j)
// sum+=tem[j]*L[i][j];
// tem[i]=(b[i]-sum)/L[i][i];
// }
//}
void fun(int n){
for(int i=1;i<=n;++i){
if(fabs(a[i][i])<exps){
cout<<"无穷多解"<<endl;
return;
}
for(int j=i+1;j<=n;++j){
double tem=a[j][i]/a[i][i];
L[j][i]=tem;
for(int k=1;k<=n;++k){
a[j][k]-=a[i][k]*tem;
}
// b[j]-=b[i]*tem;
}
}
// for(int i=1;i<=n/2;++i){
// for(int j=1;j<=n;++j)
// swap(L[i][j],L[n+1-i][j]);
// }
get_ans1(n);
// for(int i=1;i<=n/2;++i){
// swap(tem[i],tem[n+1-i]);
// }
get_ans2(n);
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n;
cin>>n;
memset(L,0,sizeof(L));
for(int i=1;i<=n;++i)
L[i][i]=1;
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)
cin>>b[i];
fun(n);
// for(int i=1;i<=n;++i){
// for(int j=1;j<=n;++j){
// cout<<L[i][j]<<" ";
// }
// cout<<endl;
// }
// for(int i=1;i<=n;++i){
// for(int j=1;j<=n;++j){
// cout<<a[i][j]<<" ";
// }
// cout<<endl;
// }
// for(int i=1;i<=n;++i)
// cout<<tem[i]<<endl;
for(int i=1;i<=n;++i)
printf("%.2f\n",ans[i]);
return 0;
}