题目描述:
雾。
题目分析:
∑ni=1(a1,i−bi)2=r2
∑
i
=
1
n
(
a
1
,
i
−
b
i
)
2
=
r
2
∑ni=1(a2,i−bi)2=r2
∑
i
=
1
n
(
a
2
,
i
−
b
i
)
2
=
r
2
…
∑ni=1(an+1,i−bi)2=r2
∑
i
=
1
n
(
a
n
+
1
,
i
−
b
i
)
2
=
r
2
这样的方程是二次的,无法用高消…我们用后面的n个式子减去第一个式子,就可以得到n个关于 bi b i 的线性方程惹…
题目链接:
Ac 代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
const int maxm=20;
double f[maxm],a[maxm][maxm];
int n;
inline void Gauss()
{
for(int i=1;i<=n;i++)
{
int r=i;
for(int j=i+1;j<=n;j++) if(std::fabs(a[r][i])<std::fabs(a[j][i])) r=i;
if(r!=i) for(int j=1;j<=n+1;j++) std::swap(a[r][j],a[i][j]);
double t=a[i][i];
for(int j=i+1;j<=n+1;j++) a[i][j]/=t;
for (int j=1;j<=n;j++)
if(i!=j)
{
double t=a[j][i];
for (int k=1;k<=n+1;k++) a[j][k]-=t*a[i][k];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lf",&f[i]);
for(int i=1;i<=n;i++)
{
double sum=0.0;
for(int j=1;j<=n;j++)
{
double x;
scanf("%lf",&x);
a[i][j]=2.0*(f[j]-x);
sum+=(x*x-f[j]*f[j]);
}
a[i][n+1]=-sum;
}
Gauss();
for(int i=1;i<=n;i++)
printf("%.3lf ",a[i][n+1]);
return 0;
}