2020 年百度之星·程序设计大赛 - 复赛(Battle for Wosneth2-概率)

本文介绍了一个游戏场景下,两个角色Alice和Bob进行对决的概率计算问题。考虑到双方的生命值、命中率,通过数学公式推导,计算了Alice在对决中生命值大于0的概率,并给出了一种算法实现。

Problem Description
你在打游戏的时候碰到了如下问题:

​ 有两个人记作Alice和Bob,生命值分别是n,m,命中率分别为p%,q%。两个人轮流攻击对方,从Alice开始攻击,每次攻击的时候,如果命中,那么能让对方的生命值减低1,直到一方的生命值不超过0为止。

求到最后Alice的生命值大于0的概率,对998244353取模。

对于一个分数a/b,其中gcd(a,b)=1,那么我们认为这个分数对998244353取模的值为一个数c(0≤c<998244353)满足bc≡a(mod998244353)。

Input
第一行一个正整数T(1≤T≤104)表示数据组数。

对于每组数据,第一行四个整数n,m,p,q(1≤n,m≤105,1≤p,q≤100)。

保证∑(n+m)≤5×106。

Output
每组测试数据,输出一个数,表示答案。

Sample Input
3
1 1 50 50
100000 1 99 100
11 45 14 19

Sample Output
665496236
713582462
419834392

Hint

第一组数据,Alice活下来的概率为2/3。

第二组数据,当且仅当Alice前100000轮全部没有命中,Alice会死亡,所以存活概率为1-0.01100000

以一轮为单位,如果两个人都没打中,那么相当于“再来一次”,我们可以去掉这种情况。
于是分别令只有Alice打中,只有Bob打中,两人都打中的概率为A=p%(1−q%)D,B=(1−p%)q%D,C=p%q%D,D=1−(1−p%)(1−q%)A=\frac{p\%(1-q\%)}{D},B=\frac{(1-p\%)q\%}{D},C=\frac{p\%q\%}{D},D=1-(1-p\%)(1-q\%)A=Dp%(1q%),B=D(1p%)q%,C=Dp%q%,D=1(1p%)(1q%)

最后一次必定为Alice击中,m事先减去1点
枚举C出现的次数iii,B出现的次数为jjj
ans=(A+C)∑i=0min(n−1,m)∑j=0n−1−iCiAm−iBj(m+j)!i!j!(m−i)!ans=(A+C)\sum_{i=0}^{min(n-1,m)}\sum_{j=0}^{n-1-i} C^iA^{m-i}B^j\frac{(m+j)!}{i!j!(m-i)!}ans=(A+C)

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值