题目
分析
发现可以列出一个方程组,于是高斯消元求解。
代码
#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
x=0;char ch=getchar();bool f=false;
while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template <typename T>
inline void write(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
return ;
}
#define ll long long
#define ull unsigned long long
#define inc(x,y,mod) (((x)+(y))>=(mod)?(x)+(y)-(mod):(x)+(y))
#define dec(x,y,mod) ((x)-(y)<0?(x)-(y)+(mod):(x)-(y))
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define dep(i,y,x) for(int i=(y);i>=(x);i--)
const int N=15,NM=62,M=2e5+5,INF=1e9+7;
const double eps=1e-8;
int n,m;
double a[N][N],d[N][N];
void Gauss(){
for(int i=1,t;i<=n;i++){
t=i;
for(int j=i;j<=n;j++) if(fabs(d[j][i])>fabs(d[t][i])) t=j;
if(t!=i) swap(d[t],d[i]);
if(fabs(d[t][i])<eps) return ;
for(int j=1;j<=n;j++){
if(i==j) continue;
double tmp=d[j][i]/d[i][i];
for(int k=i+1;k<=n+1;k++) d[j][k]-=tmp*d[i][k];
}
}
for(int i=1;i<=n;i++) d[i][n+1]/=d[i][i];
return ;
}
signed main(){
read(n);
for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=2*(a[i][j]-a[i+1][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][n+1]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
Gauss();
for(int i=1;i<=n;i++) printf("%.3lf ",d[i][n+1]);
return 0;
}