版权声明:我这种蒟蒻的文章,真正的大佬一般看不上的_(:з」∠)_ https://blog.csdn.net/Paulliant/article/details/82291467
题意
两个人分别有
颗糖果,现在他们在玩
点,已知这两人分别想出来的概率为
,赢可以获得对方的一颗糖,当某个人糖被拿完就判输,求第一个人胜利的概率。
思路
赢的概率为
,输的概率为
,那么这两个数分别除以
就能排除和的情况。
问题就转化成了已知第一个人赢的概率为
,第二个人赢的概率为
,求第一个人获胜概率。
设
为第一个人手中有
个糖果的获胜概率。
,
,
, 求
.
写出特征方程
即
解得
,
.
设通项为
即
有
即
解得
通项为
故
直接套公式解决。
代码
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
typedef long long LL;
using namespace std;
int main()
{
int n,m;
double p,q;
while(~scanf("%d%d%lf%lf",&n,&m,&p,&q))
{
double P=p*(1.0-q),Q=q*(1.0-p);
if(m==0)printf("1.00\n");
else if(n==0)printf("0.00\n");
else if(P==Q)printf("%.2lf\n",1.0*n/(n+m));
else if(P==1)printf("1.00\n");
else if(Q==1)printf("0.00\n");
else printf("%.2lf\n",(1.0-pow(Q/P,n))/(1.0-pow(Q/P,n+m)));
}
return 0;
}