专栏文章
题解:P12037 [USTCPC 2025] 数学分析
P12037题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipocqm6
- 此快照首次捕获于
- 2025/12/03 15:17 3 个月前
- 此快照最后确认于
- 2025/12/03 15:17 3 个月前
Grand_Dawn 还是太神了。
这个积分是有解析解的,所以直接考虑大除法(这个麻烦各位自行手动模拟一下):
设 .
则可以得到 , 这里 代表 分别在 中的系数。
则 的递推公式就是:, 逆序即可。
显然 .
则
由于
根据以上公式即可得到最终答案,其中在 C++ 当中, 用
CPPlog(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 而言没有什么训练价值,反而是帮助你们练习高等数学。
-
其实我们在样例中也给出了一定的提示:样例二是:, 数字直觉好一点的同学能明显就能看出来最终答案是 , 所以 是不需要高等数学知识就可以直接得出的。然后你再参考样例一及样例解释,也可以推出 , 最难的两个定积分其实我们已经提供给你们了,如果你连 都不会求的话,这道题确实不适合您(
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...