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%(1−q%),B=D(1−p%)q%,C=Dp%q%,D=1−(1−p%)(1−q%)
最后一次必定为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)∑

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





