tags:给出了n+1个点,所有点到球心距离相等。以第一个点列出式子,令其余n个点等于它,就可列出n个n元一次方程组。然后高斯消元即可。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 2e5+10; int n; double a[15][15], a0[15]; void guass() { rep(i,1,n) { double maxn=-1.0; int mi; rep(j,1,n) if(fabs(a[j][i])>maxn) maxn=fabs(a[j][i]), mi=j; if(mi!=i) rep(j,1,n+1) swap(a[mi][j], a[i][j]); rep(j,i+1,n+1) a[i][j]/=a[i][i]; rep(j,1,n) if(i!=j) { double t=a[j][i]; rep(k,1,n+1) a[j][k]-=t*a[i][k]; } } } int main() { scanf("%d", &n); rep(i,1,n) scanf("%lf", &a0[i]); rep(i,1,n) rep(j,1,n) { double x; scanf("%lf", &x); a[i][j]=2*(x-a0[j]); a[i][n+1]+=(x*x)-(a0[j]*a0[j]); } guass(); rep(i,1,n-1) printf("%.3f ", a[i][n+1]); printf("%.3f ", a[n][n+1]); return 0; }