题解:P12037 [USTCPC 2025] 数学分析

· · 题解

\gdef \d{\mathrm{d}}

考虑把这个积分拆开,也就是:

\int _ 0 ^ 1 \frac{P(x)}{x ^ 2 + 1} \d x = \sum _ {k = 0} ^ {n} a _ k \int _ 0 ^ 1 \frac{x ^ k}{x ^ 2 + 1} \d x

于是我们只需要考虑右边的那个积分就可以了。

令:

I _ k = \int _ 0 ^ 1 \frac{x ^ k}{x ^ 2 + 1} \d x

首先,我们可以发现:

I _ 0 = \int _ 0 ^ 1 \frac{1}{x ^ 2 + 1} \d x = [\arctan x] _ 0 ^ 1 = \frac{\pi}{4} I _ 1 = \int _ 0 ^ 1 \frac{x}{x ^ 2 + 1} \d x = \left[ \frac{1}{2} \ln (x ^ 2 + 1) \right] _ 0 ^ 1 = \frac{\ln 2}{2}

接着,对于 k \ge 2,我们有:

\begin{aligned} I _ k &= \int _ 0 ^ 1 \frac{x ^ k}{x ^ 2 + 1} \d x \\ &= \int _ 0 ^ 1 \frac{x ^ {k - 2} [(x ^ 2 + 1) - 1]}{x ^ 2 + 1} \d x \\ &= \int _ 0 ^ 1 x ^ {k - 2} \d x - \int _ 0 ^ 1 \frac{x ^ {k - 2}}{x ^ 2 + 1} \d x \\ &= \left[ \frac{x ^ {k - 1}}{k - 1} \right] _ 0 ^ 1 - I _ {k - 2} \\ &= \frac{1}{k - 1} - I _ {k - 2} \end{aligned}

于是照这个算就行了,时间复杂度 O(n)

#include<iostream>
#include<cmath>
#include<numbers>
#include<iomanip>

typedef long double ld;

int n; ld ans = 0, I[3] = {std::numbers::pi / 4, std::log(2) / 2};

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0), std::cout.tie(0);

    int n; std::cin >> n;
    for(int k = 0; k <= n; ++k) {
        int a; std::cin >> a;
        if(k > 1) I[k % 3] = 1. / (k - 1) - I[((k - 2) + 3) % 3];
        ans += (ld)a * I[k % 3];
    }

    std::cout << std::fixed << std::setprecision(10) << ans;

    return 0;
}