题解:P12037 [USTCPC 2025] 数学分析
Grand_Dawn 还是太神了。
这个积分是有解析解的,所以直接考虑大除法(这个麻烦各位自行手动模拟一下):
设
则可以得到
则
显然
则
由于
根据以上公式即可得到最终答案,其中在 C++ 当中,log(2) 计算,acos(-1) 计算。
#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;
}
做为校赛负责人的一员,我来说点闲话:
-
USTCPC 2025 本事是面向 USTC 所有学生开放的比赛,由于 USTC 所有本科生大一上都学习了数学分析(B1)这门课程(数学系是 A1),所以我们能够保证所有 USTC 学生能够掌握最基本的定积分知识,所以我们将这道题放在签到题的位置上。
-
但是对于没有接触过定积分的 OIer 而言,这道题的难点就很明显是数学了,很多人尝试使用自适应辛普森法去解决这道题,我的建议是最好不要尝试去走歪路(,这道题对于 OIer 而言没有什么训练价值,反而是帮助你们练习高等数学。
-
其实我们在样例中也给出了一定的提示:样例二是:
\displaystyle \int_0^1 \dfrac{4}{x^2 + 1} \mathrm{d} x , 数字直觉好一点的同学能明显就能看出来最终答案是\pi , 所以\displaystyle \int_{0}^1 \dfrac{1}{x^2 + 1} \mathrm{d} x = \dfrac{\pi}{4} 是不需要高等数学知识就可以直接得出的。然后你再参考样例一及样例解释,也可以推出\displaystyle \int_{0}^1 \dfrac{x}{x^2 + 1} \mathrm{d} x = \dfrac{\ln2}{2} , 最难的两个定积分其实我们已经提供给你们了,如果你连\displaystyle \int_{0}^1 x^i \mathrm{d} x = \dfrac{1}{i + 1} ( i \in \mathbb{N}) 都不会求的话,这道题确实不适合您(