AcWing:4646. 爬树的甲壳虫

文章讨论了一只甲壳虫爬树问题,给定每个高度爬升的概率,目标是计算从树根到树顶的期望时间。利用递推关系和费马小定理结合快速幂算法求解,给出期望值的计算方法并提供了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:

有一只甲壳虫想要爬上一颗高度为 n 的树,它一开始位于树根,高度为 0,当它尝试从高度 i−1爬到高度为 i 的位置时有 Pi 的概率会掉回树根,求它从树根爬到树顶时,经过的时间的期望值是多少。

输入格式

输入第一行包含一个整数 n 表示树的高度。

接下来 n 行每行包含两个整数 xi,yi,用一个空格分隔,表示 Pi=xi/yi。

输出格式

输出一行包含一个整数表示答案,答案是一个有理数,请输出答案对质数 998244353 取模的结果。

其中有理数 ab 对质数 P 取模的结果是整数 c 满足 0≤c<P 且 c⋅b≡a(modP)。

数据范围

对于 20% 的评测用例,n≤2,1≤xi<yi≤20;
对于 50% 的评测用例,n≤500,1≤xi<yi≤200;
对于所有评测用例,1≤n≤100000,1≤xi<yi≤109。

输入样例1:
1
1 2
输出样例1:
2
输入样例2:
3
1 2
3 5
7 11
输出样例2:
623902744

假设当高度为k时,从树根爬到k所需要的期望时间是f(k)

从f(k−1)出发,爬到高度为k有两种方式:

1.直接从k−1的位置多爬一格不掉下去;
2.从k−1个的位置多爬一个的时候先掉下去了,再从底部爬完k。

得出推导式 

f(k)=(f(k−1)+1)(1−pk)+(f(k−1)+1+f(k))pk,

化简上式

f(k)=f(k−1)+1/(1−pk)

代入 pk=xk/yk

f(k)=yk(f(k−1)+1)/yk−xk

 直接用费马小定理+快速幂求逆元

以下是AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>

/* 定义 */
using namespace std;
typedef long long LL;
const int MOD = 998244353;
int n , ans = 0;

/* 快速幂模版 */
int qsm(int a , int b)
{
    int res = 1 % MOD;
    for(; b ; b >>= 1)
    {
        if(b & 1) res = 1ll * res * a % MOD;
        a = 1ll * a * a % MOD;
    }
    return res;
}

int main()
{
    /* 读入 */
    cin >> n;
    for(int i = 0 ; i < n ; i ++)
    {
        int x , y;
        cin >> x >> y;
        /* 核心 */
        ans = (ans + 1ll) * y % MOD * qsm(y - x, MOD - 2) % MOD;
    }
    cout << ans;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值