Hermite多项式

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

按题面二阶递推式记忆化递归求 Hermite 多项式,结果补两位小数输出。

OJ: roj

题目 ID: 1165

难度:入门

标签:数学递推递归记忆化搜索python

创建: 2026-09-29 21:38

更新: 2026-10-05 04:05

题目描述

用递归的方法求 Hermite 多项式的值:

hn(x)={1n=02xn=12xhn−1(x)−2(n−1)hn−2(x)n>1h_n(x)=\begin{cases}1 & n=0 \\ 2x & n=1 \\ 2x h_{n-1}(x)-2(n-1)h_{n-2}(x) & n>1\end{cases}

给定正整数 nn 和整数 xx,求 hn(x)h_n(x) 的值。数据范围 1≤n≤101 \le n \le 10,1≤x≤101 \le x \le 10。

输入:两个数 nn 和 xx。输出:多项式的值,保留两位小数。

样例输入:1 2,样例输出:4.00。

思路

按递推式递归计算,用 memo 数组记录每个 hk(x)h_k(x) 避免重复子问题。结果必为整数,直接补 .00 输出即可避开浮点误差。

参考代码

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 21:38
# update_at: 2026-09-29 21:38

import sys
from functools import cache


@cache
def hermite(n: int, x: int) -> int:
    """返回 Hermite 多项式的值 h_n(x),由 h_0=1、h_1=2x 两条边界递推。"""
    if n < 2:
        return 1 if n == 0 else 2 * x
    return 2 * x * hermite(n - 1, x) - 2 * (n - 1) * hermite(n - 2, x)


def solve() -> None:
    n, x = map(int, sys.stdin.buffer.read().split())
    value = hermite(n, x)
    # 输出恰好两位小数:x 是整数,h_n(x) 必为整数,拼接 ".00" 即可。
    # 不用 f"{value:.2f}",那会先转成 float,大整数时会丢掉低位数字。
    print(f"{value}.00")


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 21:45
 * update_at: 2026-10-05 04:05
 */
#include <cstdio>
#include <iostream>
using namespace std;

typedef long long ll;

ll n, x;

// 记忆化数组:memo[i] 表示 h_i(x) 的值,0 表示尚未计算。
// 本题 n <= 10,用 ll 足够。
ll memo[15];

// 按题面二阶递推式递归求 Hermite 多项式 h_n(x)
ll hermite(ll k) {
    if (memo[k] != 0) return memo[k];
    if (k == 0) return memo[k] = 1;
    if (k == 1) return memo[k] = 2 * x;
    return memo[k] = 2 * x * hermite(k - 1) - 2 * (k - 1) * hermite(k - 2);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> x;
    ll ans = hermite(n);
    // 结果必为整数,按要求补两位小数输出,避免浮点精度问题。
    cout << ans << ".00" << endl;
    return 0;
}