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

本文介绍了一种求解特定类型的多项式方程的方法,通过枚举整数解并考虑重根的情况,利用杨辉三角确定系数,最终通过暴力搜索找到符合条件的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
这里写图片描述

分析:
一定为整数解且一定有解。所以说一定可以变为这样的形式
(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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值