您的位置:首页 > 其它

2016年提高组模拟试题(20161105) 方程式

2016-11-08 16:45 316 查看




分析:

一定为整数解且一定有解。所以说一定可以变为这样的形式

(x-a1)(x-a2)(x-a3)…(x-an)=0

解就是a1…an。

但是会有重根,也就是说(x-ai)^k(k>=1)。

我们首先在0~20内枚举所有解,如果不够n个(题目有说,我也不清楚为什么有n个解,证明自己去看)。

然后就可以枚举k,如果有t个解,那就有n-t个重根,也就是(1<=k<=n-t)。枚举每个(x-ai)^k的k,然后看看化简后的各项系数是不是题目给的,就可以暴力过。

代码:

(f为杨辉三角,可以用它来确定某项的k次幂的各项系数)

var
a,x,b,q,q1,q2:array [0..20] of longint;
power,f:array [-20..20,0..10] of longint;
n,num:longint;
i,j:longint;
s:longint;
procedure dfs(xx:longint);
var i,j,k:longint;
flag:boolean;
begin
if xx=num+1 then
begin
fillchar(q,sizeof(q),0);
fillchar(q1,sizeof(q1),0);
fillchar(q2,sizeof(q2),0);
for i:=1 to b[1]+1 do
q[b[1]-i+2]:=(f[b[1],i]*power[-x[1],i-1]);
fillchar(q1,sizeof(q1),0);
for i:=2 to num do
begin
for k:=1 to b[i]+1 do
q2[b[i]-k+2]:=(f[b[i],k]*power[-x[i],k-1]);
for j:=1 to n do
for k:=1 to b[i]+1 do
q1[j+k-1]:=(q1[j+k-1]+q[j]*q2[k]);
q:=q1;
fillchar(q1,sizeof(q1),0);
end;
flag:=true;
for i:=1 to n do
begin
if (a[i]<>q[i]) then
begin
flag:=false;
break;
end;
end;
if flag then
begin
for i:=1 to num do
for j:=1 to b[i] do
write(x[i],' ');
halt;
end;
exit;
end;
for i:=1 to n-num do
begin
b[xx]:=i;
dfs(xx+1);
end;
end;

begin
readln(n);
for i:=1 to n+1 do
read(a[i]);
inc(n);
if a[1]=0 then
begin
inc(num);
x[num]:=0;
end;
for i:=1 to 20 do
begin
power[i,0]:=1;
power[-i,0]:=1;
for j:=1 to 7 do
begin
power[i,j]:=power[i,j-1]*i;
if odd(j) then power[-i,j]:=-power[i,j]
else power[-i,j]:=power[i,j];
end;
end;
for i:=1 to 20 do
begin
s:=0;
for j:=1 to n do
s:=s+a[j]*power[i,j-1];
if s=0 then
begin
inc(num);
x[num]:=i;
end;
end;
f[1,1]:=1;
f[1,2]:=1;
for i:=2 to n-num do
begin
for j:=1 to i+1 do
f[i,j]:=f[i-1,j]+f[i-1,j-1];
end;
dfs(1);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: