题解:P12037 [USTCPC 2025] 数学分析
Azure_F
·
·
题解
\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;
}