计算多项式的值

GitHub跳转原题关系图返回列表

用前缀积递推把 O(n²) 的重复乘幂压成 O(n),并保持自低次到高次的左折叠次序,使浮点结果与判题数据一致。

OJ: roj

题目 ID: 1093

难度:入门

标签:入门数学浮点数python

创建: 2026-09-29 18:48

更新: 2026-10-05 00:49

题目描述

求多项式 xn+xn−1+⋯+x+1x^n+x^{n-1}+\cdots+x+1 的值,输入单精度浮点数 xx 和正整数 nn(n≤106n\le 10^6),结果保留两位小数。样例:输入 2.0 4,输出 31.00。

思路

维护前缀积 pp,初始 p=1p=1(即 x0x^0),每步把 pp 累加进答案再令 p←p⋅xp\gets p\cdot x,一次扫描即可得到所有 xkx^k 和部分和,避免对每个 kk 重新乘出 xkx^k。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 19:40
# update_at: 2026-09-29 19:08

import sys
from functools import reduce
from itertools import accumulate, repeat
from operator import add, mul


def solve() -> None:
    x_text, n_text = sys.stdin.buffer.read().split()
    x, n = float(x_text), int(n_text)
    # 前缀积从 1.0 起步再自乘 n 次,依次产出 x^0, x^1, ..., x^n
    powers = accumulate(repeat(x, n), mul, initial=1.0)
    # reduce 是左折叠(((1 + x^0) + x^1) + ...),与参考实现逐步累加的舍入次序一致
    print(f"{reduce(add, powers):.2f}")


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-09-29 19:14
 * update_at: 2026-10-05 00:49
 */
#include <cstdio>

typedef long long ll; // 题目数据统一用 long long,规模大时也足够

// 题面:求 x^0 + x^1 + ... + x^n,结果保留两位小数输出
// 思路:维护前缀积 p = x^k,从 p = 1 起步,每步 p *= x 再把 p 加进 sum
// 这样只需 n 次乘法,复杂度 O(n)
int main() {
    double x;   // x 在 float 范围内
    ll n;       // n <= 10^6,用 long long 安全
    if (scanf("%lf %lld", &x, &n) != 2) return 0;

    double sum = 0.0; // 部分和 S_k,按低次到高次的顺序累加
    double p = 1.0;   // 前缀积,初始为 x^0
    for (ll i = 0; i <= n; ++i) {
        sum += p;     // 把当前的 x^i 加进答案
        p *= x;       // 递推得到下一个前缀积 x^(i+1)
    }

    // 保留两位小数输出
    printf("%.2f\n", sum);
    return 0;
}