点击这里查看原题
设球心坐标为(x1,x2,x3,…,xn),某个点的坐标为(y1,y2,y3,…,yn),点到球心的距离为L,那么
L2=(y12−2∗x1∗y1+x12)+(y22−2∗x2∗y2+x22)+(y32−2∗x3∗y3+x32)+...+(yn2−2∗xn∗yn+xn2)
同理可以得到其他点与球心距离的式子,n+1个式子相减,刚好消掉所有 xi2 并得到n个式子
/*
User:Small
Language:C++
Problem No.:1013
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=15;
const double eps=1e-6;
double a[M][M],st[M];
int n;
bool gauss_jordan(){
for(int i=0;i<n;i++){
int p=i;
for(int j=i+1;j<n;j++)
if(fabs(a[j][i])>fabs(a[p][i])) p=j;
swap(a[i],a[p]);
if(fabs(a[i][i])<eps) return 0;//无解或无穷解
for(int j=i+1;j<=n;j++) a[i][j]/=a[i][i];
for(int j=0;j<n;j++){
if(i==j) continue;
for(int k=i+1;k<=n;k++){
a[j][k]-=a[j][i]*a[i][k];
}
}
}
return 1;
}
int main(){
freopen("data.in","r",stdin);//
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lf",&st[i]);
for(int i=0;i<n;i++){
double x;
for(int j=0;j<n;j++){
scanf("%lf",&x);
a[i][j]=2*(x-st[j]);
a[i][n]+=x*x-st[j]*st[j];
}
}
gauss_jordan();
for(int i=0;i<n;i++){
printf("%.3lf%c",a[i][n],i==n-1?'\n':' ');
}
return 0;
}