第十三届蓝桥杯省赛A组题解传送门
题目大意
有一只甲壳虫想要爬上一颗高度为n的树,它一开始位于树根,高度为0,当它尝试从高度i−1爬到高度为i的位置时有Pi的概率会掉回树根,求它从树根爬到树顶时,经过的时间的期望值是多少
解题思路
不懂数学期望的话看看定义就能懂,这是离散型的随机变量,微积分那一块不用管
数学期望定义
记Ei为甲壳虫从高度为i的地方爬到树顶的时间期望
那么根据题意,能列出下面两个式子
(1) En=0
(2) Ei=1+Pi+1E0+(1−Pi+1)Ei+1
我们可以由此递推出E0的表达式,即从树根爬到树顶的时间期望
推导过程如下(Markdown语法太长了就不打了):
推导到这里,题目完成了一半
现在我们知道了E0表达式和每个Pi,思考怎么快速求出来E0
E0是一个和式,记si为和式的第i项,可以发现每个si是可以由si−1快速得到的
最后,这题还考察了除法取余,需要乘法逆元
因为它模数给的是998244353,基本上就是明示我们直接用费马小定理+快速幂求逆元即可
实际代码并不难,能推出E0表达式基本就成功了
具体代码
#include <bits/stdc++.h>
typedef long long LL;
const int N = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 998244353;
int a[N], b[N];
int n;
int qmi(int a, int k, int p)
{
int res = 1 % p;
while (k)
{
if (k & 1)
res = (LL)res * a % p;
a = (LL)a * a % p;
k >>= 1;
}
return res;
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin >> n;
for (int i = 1; i <= n; ++i)
std::cin >> a[i] >> b[i];
int res = 0;
LL t = 1;
for (int i = 1; i <= n; ++i) //并不需要真的开个s数组,直接维护一个t就行
{
t = t * b[n - i + 1] % MOD;
t = t * qmi(b[n - i + 1] - a[n - i + 1], MOD - 2, MOD) % MOD;
res = (res + t) % MOD;
}
std::cout << res << '\n';
return 0;
}
好工整!
为什么不掉落的时候 期望时间还要+1呢?
同问
掉下来也是先从第i层爬到了第i+1层掉下来的,这个1是你只要尝试了向上爬就一定会消耗的时间。
另外推荐看另一位同学 卡冈图亚 的题解,思路更好
好滴谢谢呐
好的好的 谢谢!
学到了
太强了
讲得太好了,看完这个知道乘法逆元的用途了
牛逼
字儿写得不错
好工整啊
妙啊,妙蛙种子妙妙屋妙到家了
qiang
请问,文中根据题意得出的第2个式子是怎么来的呀?
为什么每一步t都要%mod,只有最后结果% mod不可以吗
加减乘每一步都%不会改变结果,比如(25 % 12) x (23 % 12) = (25 x 23) % 12=11,最后再模的话中间说不定哪步数据连long long都装不下
wow,懂了,谢谢
你认真的吗? (25 % 12) + (23 % 12) = (25 + 23) % 12 ?
你左边最后还要再%啊,模意义下每一步都要模
可以说下原理吗, 我记得高数里面 明确说了: 模运算 不能使用 分配律, 谢谢
不知道你指的是什么
乘运算满足分配律 指的是 a x (b + c) = a x b + a x c
那模运算当然不满足这个分配律 a % (b + c) = a % b + a % c
上面的性质本身就和分配律没什么关系
加减乘运算可以先对每个数取模,再做最后运算,是因为模运算满足同余性质
原来这叫同余性质, 我没有学过数论, 只学过高等函数, 刚才去知乎看了原理 才明白, 这个解析 我看着真头大啊QAQ, 大佬可以解释以下为什么快速幂求逆元 = (x-y)^(-1)吗