题目分析
给了一个D维多项式f(x)(D最大5),然后给了f(0),f(1)….f(n+2),其中有个f(x)是错误的,让你找出这个X。
假设有个方程f(x)=ax^5+bx^4+cx^3+dx^2+ex+f*1
给了你x和f(x),那么你等于可以得到7个6元等式,现在如果既可以的到一个7*6的矩阵,然后穷举删去某一行,如果删去的是一个错误的解的哪行,做一个高斯消元,然后必定会得到一行全0 (由计算公式可以直接的出)。由此可以判断哪行是错误的。
PS:进度问题,如何判断一个数是0,做题时,试了好几次不同的精度都不对,由于必定有一个解,所以,加了个判断最接近0 的一行作为错误解得出,AC通过。
AC代码
#include <iostream>
using namespace std;
int d;
double a[8][7];
double ans[7][7];
void transferM(double array[][7])
{
int row1,row2,col;
double m;
for(row1=0;row1<d+2;row1++)
{
for(row2=row1+1;row2<d+2;row2++)
{
m=array[row2][row1]/array[row1][row1];
for(col=row1;col<d+2;col++)
{
array[row2][col]-=array[row1][col]*m;
}
}
}
}
void print(double ans[][7])
{
int i,j;
for (i=0;i<=d+2;i++){
for (j=0;j<d+2;j++)
{
cout<<ans[i][j]<<" ";
}cout<<endl;}
cout<<endl;
}
void work(int k)
{
int i,j,t;
for (i=0,j=0;i<=d+2;i++)
{
if(i!=k)
{
for (t=0;t<d+2;t++)
ans[j][t]=a[i][t];
j++;
}
}
}
int main()
{
while ((cin>>d) && d!=0)
{
int i,j,k;
double tt=100000;int ta=0;
for (i=d+2;i>=0;i--)
{
for (j=0;j<=d;j++)
{
a[i][j]=1;
for (k=1;k<=d-j;k++)
a[i][j]*=(d+2-i);
}
cin>>a[i][d+1];
}
for (i=d+2;i>=0;i--)
{
work(i);
transferM(ans);
if(ans[d+1][d+1]<0)ans[d+1][d+1]*=-1;
if(ans[d+1][d+1]<tt)
{
tt=ans[d+1][d+1];
ta=i;
}
}
cout<<d+2-ta<<endl;
}
return 0;
}