Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 555 Solved: 273
[Submit][Status][Discuss]
Description
Alice和Bob在玩一个游戏。有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事。取到最后一颗石子的人胜利。Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bob有q的概率投掷出他相投的一面。
现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少。
Input
第一行一个正整数t,表示数据组数。
对于每组数据,一行三个数n,p,q。
Output
对于每组数据输出一行一个实数,表示Alice胜利的概率,保留6位小数。
Sample Input
1
1 0.5 0.5
Sample Output
0.666667
HINT
数据范围:
1<=t<=50
0.5<=p,q<=0.99999999
对于100%的数据 1<=n<=99999999
Source
题解
(f[i])表示剩i个石头,Alice先手获胜的概率
(g[i])表示剩i个石头,Alice后手获胜的概率
不妨设他们都想选
有
(f[i] = p imes g[i-1] + (1-p) imes g[i])
(g[i] = q imes f[i-1] + (1-q) imes f[i])
不想选只需把(p)与((1-p))互换,(q)与((1-q))即可
这个式子看上去是不能推的,但观察发现下面式子左边是(g[i]),右边是(f[i-1])和(f[i]),上面的式子右边是(g[i])和(g[i-1]),左边是 $ g[i](
所以把下边的式子待到上面去就能得到)f[i](等于关于)g[i-1](,)f[i-1](的多项式,)f[i](就可以递推了
)g[i]$同理
那么如何确定想选还是不想选呢?
不难发现,如果(f[i-1] > g[i-1]),肯定是不想选的,Ailce想让Bob选成剩下(i-1)个,这样自己获胜概率大一些
反之,如果(f[i-1] < g[i-1]),肯定是想选的,同理
但是n很大,线性也做不了
不(题)难(解)发(上)现(说)n大了之后概率变动很小
既然是n的那就让n最大跑个1000W吧(或者卡时跑)