【NOIP2016提高A组集训第3场10.31】方程式

本文介绍了一种解决多项式方程的算法,通过分解方程为一系列因子(x-xk),并逐步去除已找到根的影响来求解。具体步骤包括寻找最小解、使用大除法简化方程等。

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

Description
这里写图片描述
Input
这里写图片描述
Sample Input

输入1:
3
-2 5 -4 1
输入2:
4
8 -20 18 -7 1
输入3:
2
2 -3 1
Output
这里写图片描述
Sample Output

输出1:
1 1 2
输出2:
1 2 2 2
输出3 :
1 2
这里写图片描述
Data Constraint
这里写图片描述

题解

首先我们知道一个n次方程一定可以分解成(x-x1)(x-x2)……(x-xp)的形式
那么我们每次先找出一个最小的可以满足当前方程的解
然后用大除法把(x-xk)的项去掉
重复做n次就可以了

贴代码

var
    a:array[0..10]of int64;
    b:array[0..10]of int64;
    i,j,k,n,now:longint;
    x,y,z,p,t:int64;
begin
    assign(input,'equation.in'); reset(input);
    assign(output,'equation.out'); rewrite(output);
    readln(n);
    for i:=1 to n+1 do read(a[i]);
    x:=0;
    for i:=n+1 downto 1 do
    begin
        b[i]:=a[x+1];
        inc(x);
    end;
    now:=n+1;
    for i:=1 to n do
    begin
        for j:=1 to 20 do
        begin
            x:=0;
            y:=1;
            for k:=now downto 1 do
            begin
                x:=x+b[k]*y;
                y:=y*j;
            end;
            if x=0 then break;
        end;
        write(j,' ');
        x:=now-1;
        t:=j;
        p:=0;
        fillchar(a,sizeof(a),0);
        for j:=1 to now-1 do
        begin
            p:=b[j]-p;
            a[j]:=p;
            p:=-t*p;
        end;
        b:=a;
        dec(now);
    end;
    close(input); close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值