题意
两个人分别有
N,M
N
,
M
颗糖果,现在他们在玩
24
24
点,已知这两人分别想出来的概率为
p,q
p
,
q
,赢可以获得对方的一颗糖,当某个人糖被拿完就判输,求第一个人胜利的概率。
1≤N,M≤50
1
≤
N
,
M
≤
50
思路
赢的概率为
p(1−q)
p
(
1
−
q
)
,输的概率为
q(1−p)
q
(
1
−
p
)
,那么这两个数分别除以
p(1−q)+q(1−p)
p
(
1
−
q
)
+
q
(
1
−
p
)
就能排除和的情况。
问题就转化成了已知第一个人赢的概率为
p
p
,第二个人赢的概率为
q
q
(p+q=1)
(
p
+
q
=
1
)
,求第一个人获胜概率。
设
an
a
n
为第一个人手中有
n
n
个糖果的获胜概率。
,
a0=0
a
0
=
0
,
aN+M=1
a
N
+
M
=
1
, 求
aN
a
N
.
an−1=qan+pan−2
a
n
−
1
=
q
a
n
+
p
a
n
−
2
an=1pan−1−qpan−2
a
n
=
1
p
a
n
−
1
−
q
p
a
n
−
2
写出特征方程
x2−1px+qp=0
x
2
−
1
p
x
+
q
p
=
0
即
x2−1px+1−pp=0
x
2
−
1
p
x
+
1
−
p
p
=
0
解得
x1=1−pp=qp
x
1
=
1
−
p
p
=
q
p
,
x2=1
x
2
=
1
.
设通项为
an=K1(qp)n+K21n
a
n
=
K
1
(
q
p
)
n
+
K
2
1
n
即
an=K1(qp)n+K2
a
n
=
K
1
(
q
p
)
n
+
K
2
有
a0=K1+K2,aN+M=K1(qp)N+M+K2
a
0
=
K
1
+
K
2
,
a
N
+
M
=
K
1
(
q
p
)
N
+
M
+
K
2
即
K1+K2=0,K1(qp)N+M+K2=1
K
1
+
K
2
=
0
,
K
1
(
q
p
)
N
+
M
+
K
2
=
1
解得
K1=1(qp)N+M−1,K2=−1(qp)N+M−1
K
1
=
1
(
q
p
)
N
+
M
−
1
,
K
2
=
−
1
(
q
p
)
N
+
M
−
1
通项为
an=(qp)n−1(qp)N+M−1
a
n
=
(
q
p
)
n
−
1
(
q
p
)
N
+
M
−
1
故
aN=(qp)N−1(qp)N+M−1
a
N
=
(
q
p
)
N
−
1
(
q
p
)
N
+
M
−
1
直接套公式解决。
代码
#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;
}