1 条题解
-
0
思路与算法
令当前值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