专栏文章

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

P12037题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipocqm6
此快照首次捕获于
2025/12/03 15:17
3 个月前
此快照最后确认于
2025/12/03 15:17
3 个月前
查看原文
Grand_Dawn 还是太神了。
这个积分是有解析解的,所以直接考虑大除法(这个麻烦各位自行手动模拟一下):
P(x)=(x2+1)Q(x)+R(x),deg(R)<2,Q(x),R(x)Z[x]P(x) = (x^2 + 1)Q(x) + R(x), \operatorname{deg}(R) < 2, Q(x), R(x) \in \mathbb{Z[x]}.
则可以得到 Qn=Pn+2Pn+4+Pn+6Q_n = P_{n + 2} - P_{n + 4} + P_{n + 6} - \cdots, 这里 Qn,PnQ_n, P_n 代表 xnx^n 分别在 Q(x),P(x)Q(x), P(x) 中的系数。
QnQ_n 的递推公式就是:Qn=Pn+2Qn+2Q_n = P_{n + 2} - Q_{n + 2}, 逆序即可。
显然 R(x)=Q1x+Q2R(x) = Q_{-1}x + Q_{-2}.
01P(x)x2+1dx=i=0n201Qixidx+01Q1xx2+1dx+01Q2x2+1dx\displaystyle \int_{0}^1 \dfrac{P(x)}{x^2 + 1} \mathrm{d} x = \sum_{i = 0}^{n - 2} \int_{0}^1 Q_i x^i \mathrm{d} x + \int_{0}^1 \dfrac{Q_{-1}x}{x^2 + 1} \mathrm{d} x + \int_{0}^1 \dfrac{Q_{-2}}{x^2 + 1} \mathrm{d} x
由于
01Qixidx=Qii+1,iN\displaystyle \int_{0}^1 Q_i x^i \mathrm{d} x = \dfrac{Q_i}{i + 1}, i \in \mathbb{N} 01Q1xx2+1dx=Q1201d(x2+1)x2+1=Q12ln2\displaystyle \int_{0}^1 \dfrac{Q_{-1}x}{x^2 + 1} \mathrm{d} x = \dfrac{Q_{-1}}{2} \int_{0}^1 \dfrac{\mathrm{d}(x^2 + 1)}{x^2 + 1} = \dfrac{Q_{-1}}{2} \ln 2 01Q2x2+1dx=Q2arctan(1)=Q24π\displaystyle \int_{0}^{1} \dfrac{Q_{-2}}{x^2 + 1} \mathrm{d} x = Q_{-2} \arctan(1) = \dfrac{Q_{-2}}{4} \pi
根据以上公式即可得到最终答案,其中在 C++ 当中,ln2\ln2log(2) 计算,π\piacos(-1) 计算。
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;

const long long MAXN = 1e5 + 10;
const double A = log(2);
const double B = acos(-1);

inline long long read() {
    long long x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

long long n;
double a[MAXN], b[MAXN];

int main() {
    n = read();
    for (long long i = 0; i <= n; i++) scanf("%lf", &a[i]);
    for (long long i = n - 2; i >= 0; i--) b[i] = a[i + 2] - b[i + 2];
    double ans = 0;
    for (long long i = 0; i <= n - 2; i++) ans += (double)(b[i] / ((i + 1) * 1.0000000));
    ans += A * (double)((a[1] - b[1]) / 2.00000000);
    ans += B * (double)((a[0] - b[0]) / 4.00000000);
    printf("%.10lf\n", ans);
    return 0;
}
做为校赛负责人的一员,我来说点闲话:
  1. USTCPC 2025 本事是面向 USTC 所有学生开放的比赛,由于 USTC 所有本科生大一上都学习了数学分析(B1)这门课程(数学系是 A1),所以我们能够保证所有 USTC 学生能够掌握最基本的定积分知识,所以我们将这道题放在签到题的位置上。
  2. 但是对于没有接触过定积分的 OIer 而言,这道题的难点就很明显是数学了,很多人尝试使用自适应辛普森法去解决这道题,我的建议是最好不要尝试去走歪路(,这道题对于 OIer 而言没有什么训练价值,反而是帮助你们练习高等数学。
  3. 其实我们在样例中也给出了一定的提示:样例二是:014x2+1dx\displaystyle \int_0^1 \dfrac{4}{x^2 + 1} \mathrm{d} x, 数字直觉好一点的同学能明显就能看出来最终答案是 π\pi, 所以 011x2+1dx=π4\displaystyle \int_{0}^1 \dfrac{1}{x^2 + 1} \mathrm{d} x = \dfrac{\pi}{4} 是不需要高等数学知识就可以直接得出的。然后你再参考样例一及样例解释,也可以推出 01xx2+1dx=ln22\displaystyle \int_{0}^1 \dfrac{x}{x^2 + 1} \mathrm{d} x = \dfrac{\ln2}{2}, 最难的两个定积分其实我们已经提供给你们了,如果你连 01xidx=1i+1(iN)\displaystyle \int_{0}^1 x^i \mathrm{d} x = \dfrac{1}{i + 1} ( i \in \mathbb{N}) 都不会求的话,这道题确实不适合您(

评论

0 条评论,欢迎与作者交流。

正在加载评论...