题目描述
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
输入格式
第一行是一个整数n。
接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。
输出格式
有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后3位。
数据保证有解。你的答案必须和标准输出一模一样才能够得分。
样例输入
1 | 2 |
样例输出
1 | 0.500 1.500 |
数据规模与约定
对于40%的数据,$1<=n<=3$。
对于100%的数据,$1<=n<=10$。
1、 球心:到球面上任意一点距离都相等的点。
2、 距离:设两个n为空间上的点A, B的坐标为$(a_1,a_2,…,a_n),(b_1,b_2,…,b_n),则AB的距离定义为:
$dist=sqrt((a_1−b_1)^2+(a_2−b_2)^2+…+(a_n−b_n)^2)$
数据中所有数据绝对值小于 10000 。
- 因为是一个球,所以每个点到球心的距离都相等,
我们设这个半径为R,球心坐标为$O(x_1,x_2,….,x_n)$;
那么对于每一个点$P(ai1,ai2,…,ain)$:我们易得
$sqrt ( ( ai1 - x1 ) ^ 2 + ( ai2 - x2 ) ^ 2 + … + ( ain - xn ) ^2 ) = R$;
- 考虑构造方程组
将上式两侧平方再展开,得
$-2 ( ai1 x1 + ai2 x2 + … + ain * xn )+( ai1 ^ 2 + ai2 ^ 2 + … + ain ^ 2 )+( x1 ^ 2 + x2 ^ 2 + … + xn ^ 2 )$
= $R ^ 2$;
给出n+1个点,n个点就可以构造该方程组,那多给的一个点是用来(设选第一个点为这个点) 消掉重复出现的部分$( x1 ^ 2 + x2 ^ 2 + … + xn ^ 2 )$和$R ^ 2$,
即令其他所有的点的方程都减掉多的一个点的方程,整理得到其他方程格式为:
$2 ( ai1 x1 + ai2 x2 + … + ain * xn )$
=$ ( ai1 ^ 2 + ai2 ^ 2 + … + ain ^ 2 ) - ( a11 ^ 2 + a12 ^ 2 + … + a1n ^ 2 ) - 2 ( a11 x1 + a12 x2 + … + a1n * xn ) $;
右侧是常数,左侧展开就是一个愉快的高斯消元方程组.
Code…
1 |
|