高斯消元

/**************************************************************
    Problem: 1013
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:12 ms
    Memory:824 kb
****************************************************************/
 
/*
    可以证明 要确定一个n为的东西
    就需要n+1个俩俩不共线的点 
    选择其中一个点作为没接 与剩下n个点 建立方程
    刚好 n个未知量 n个方程 高斯消元! 
*/
#include<cmath>
#include<cstdio> 
#include<algorithm>
#define db double
#define sqr(x) ((x)*(x))
using namespace std;
const int N=20;
int n;
db f[N][N],A[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
    {
        scanf("%lf",&A[i]); A[n+1]+=sqr(A[i]); 
    }
    for(int i=1;i<=n;i++)
    {
        double all=0,x;
        for(int j=1;j<=n;j++) 
        {
            scanf("%lf",&x); all+=sqr(x); 
            f[i][j]=2*(A[j]-x);
        }
        f[i][n+1]=A[n+1]-all;
    }
    for(int i=1;i<=n;i++)
    {
        int bj=i;
        for(int j=i+1;j<=n;j++) 
            if(fabs(f[bj][i])<fabs(f[j][i])) bj=j;
        swap(f[i],f[bj]);
        double t=f[i][i];
        for(int j=1;j<=n+1;j++) f[i][j]/=t;
        for(int j=1;j<=n;j++) if(j!=i)
        {
            double p=f[j][i];
            for(int k=1;k<=n+1;k++) f[j][k]-=f[i][k]*p;
        }
    }
    for(int i=1;i<=n;i++) printf("%.3lf ",f[i][n+1]);
    printf("\n");
     
    return 0;
}