题目:
题意:
在 n n n维的坐标系中给出 n + 1 n+1 n+1个点,有一性质即原点到这 n + 1 n+1 n+1的距离相等,问原点的坐标是多少
分析:
因为所有点到原点的距离相等,所有可以设
D
D
D表示距离,
a
i
,
j
a_{i,j}
ai,j表示第
i
i
i个点的第
j
j
j个坐标,
x
j
x_j
xj表示原点的第
j
j
j个坐标
那就有
∑
j
=
1
n
(
a
i
,
j
−
x
j
)
2
=
D
(
i
=
1
,
2
,
…
n
)
\sum_{j=1}^n(a_{i,j}-x_j)^2=D(i=1,2,…n)
j=1∑n(ai,j−xj)2=D(i=1,2,…n)
这样的式子肯定是毫无头绪的,所以我们尝试下将相邻的式子作差,从而消掉
D
D
D,得到
∑
j
=
1
n
a
i
,
j
2
−
a
i
+
1
,
j
2
−
2
∗
x
j
∗
(
a
i
,
j
−
a
i
+
1
,
j
)
=
0
\sum_{j=1}^na_{i,j}^2-a_{i+1,j}^2-2*x_j*(a_{i,j}-a_{i+1,j})=0
j=1∑nai,j2−ai+1,j2−2∗xj∗(ai,j−ai+1,j)=0
移项可得
∑
j
=
1
n
2
∗
x
j
∗
(
a
i
,
j
−
a
i
+
1
,
j
)
=
∑
j
=
1
n
a
i
,
j
2
−
a
i
+
1
,
j
2
\sum_{j=1}^n2*x_j*(a_{i,j}-a_{i+1,j})=\sum_{j=1}^na_{i,j}^2-a_{i+1,j}^2
j=1∑n2∗xj∗(ai,j−ai+1,j)=j=1∑nai,j2−ai+1,j2
因为
a
a
a是我们已知的,所以就相当于求出每个满足方程的
x
j
x_j
xj,用高斯消元就可以处理
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define LZX Mu
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
double a[15][15],b[15],c[15][15],eps=1e-7;
int main()
{
int n=read();
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++)
{
c[i][j]=2*(a[i][j]-a[i+1][j]);
b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
if(fabs(c[j][i]>eps))
{
swap(c[i],c[j]);
swap(b[i],b[j]);
}
for(int j=1;j<=n;j++)
{
if(i==j) continue;
double mul=c[j][i]/c[i][i];
for(int k=1;k<=n;k++) c[j][k]-=c[i][k]*mul;
b[j]-=b[i]*mul;
}
}
for(int i=1;i<=n;i++) printf("%.3lf ",b[i]/c[i][i]);
return 0;
}