1 条题解

  • 0
    @ 2026-10-27 12:58:42

    思路与算法

    令当前值s=1。依次执行n次s=x·s+1,即霍纳法。它把重复求幂化成每层一次乘法和一次加法。使用long double保存中间结果,最后输出两位小数。

    正确性说明

    对执行次数k归纳:初始s=1等于S0;若当前为1+x+…+x^k,则乘x再加1恰好是Sk+1,n次后得到目标多项式。对于x≥0,中间和不超过最终正和;x≤0时可将相邻项配对,所有中间绝对值不超过1+|x|+|Sn|的常数量级,修订范围内不会浮点溢出。long double运算并按题定绝对/相对误差判定。

    复杂度

    初始化O(1),循环O(n)次,总时间O(n),额外空间O(1);输入输出十进制文本还需与文本长度成正比的时间。

    易错点

    n次更新得到n+1项;x=1无需除以x−1,x=−1可有严格抵消。题面按输入十进制数学值解释,数值评测允许公开误差;不要把两位小数显示要求当成必须逐字相等。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        string token;
        int n;
        cin >> token >> n;
        long double x = strtold(token.c_str(), nullptr);
        long double ans = 1;
        for (int i = 0; i < n; i++)
            ans = ans * x + 1;
        cout << fixed << setprecision(2) << ans << '\n';
    }
    
    • 1

    信息

    ID
    2069
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者