Description
给定 k , p a , p b k,pa,pb k,pa,pb,有一初始为空的序列。
每次有
p
a
p
a
+
p
b
\dfrac{pa}{pa+pb}
pa+pbpa 的概率往序列后面加一个 a
。
每次有
p
b
p
a
+
p
b
\dfrac{pb}{pa+pb}
pa+pbpb 的概率往序列后面加一个 b
。
当出现大于等于
k
k
k 个形如 ab
的子序列(a
和 b
不一定相邻)时停止。
求序列最终的 ab
子序列期望数。
Solution
为了更加简洁,文中的 p a pa pa 指题意中的 p a p a + p b \dfrac{pa}{pa+pb} pa+pbpa, p b pb pb 指 p b p a + p b \dfrac{pb}{pa+pb} pa+pbpb。
看到求期望,可以先试着写写 dp
。
设
f
i
,
j
,
t
f_{i,j,t}
fi,j,t 表示有
i
i
i 个 a
、
j
j
j 个 b
、
t
t
t 个 ab
时的期望。
发现当前有
i
i
i 个 a
时,再加一个 b
会产生
i
i
i 个 ab
,与之前 b
的数量无关,所以省去一维 dp
。
设
f
i
,
j
f_{i,j}
fi,j 表示有
i
i
i 个 a
、
j
j
j 个 ab
时的期望。
由于我们只知道终止状态,所以倒推会更好写且容易理解。
f
i
,
j
f_{i,j}
fi,j 有
p
a
pa
pa 的概率加 a
变为
f
i
+
1
,
j
f_{i+1,j}
fi+1,j,有
p
b
pb
pb 的概率加 b
变为
f
i
,
j
+
i
f_{i,j+i}
fi,j+i,得出转移方程:
f i , j = p a × f i + 1 , j + p b × f i , j + i f_{i,j}=pa\times f_{i+1,j}+pb\times f_{i,j+i} fi,j=pa×fi+1,j+pb×fi,j+i
答案即为 f 1 , 0 f_{1,0} f1,0。
接下来是本题最难部分,求满足终止条件的 f f f 值。
终止条件为
i
+
j
≥
k
i+j\ge k
i+j≥k,此时只要再加一个 b
就可以终止。
然而在加 b
前可能有若干个 a
,无法确定 a
的数量,所以要开始推式子。
Sol1
这种方法用了等比数列的思想。
f i , j ( i + j ≥ k ) = i + j + ∑ x = 0 ∞ p a x × p b × x f_{i,j(i+j\ge k)}=i+j+\sum\limits_{x=0}^\infty pa^x\times pb\times x fi,j(i+j≥k)=i+j+x=0∑∞pax×pb×x
x
x
x 为 a
的出现次数,a
每多在 b
前出现一次,最后的 ab
就会多一个,所以总共加了
i
+
j
+
x
i+j+x
i+j+x 个 ab
。
继续推:
= i + j + p b × ∑ x = 0 ∞ p a x × x =i+j+pb\times\sum\limits_{x=0}^\infty pa^x\times x =i+j+pb×x=0∑∞pax×x
= i + j + ( 1 − p a ) × ∑ x = 0 ∞ p a x × x =i+j+(1-pa)\times\sum\limits_{x=0}^\infty pa^x\times x =i+j+(1−pa)×x=0∑∞pax×x
设 T = ∑ x = 0 ∞ p a x × x T=\sum\limits_{x=0}^\infty pa^x\times x T=x=0∑∞pax×x。
∴ p a × T = ∑ x = 1 ∞ p a x × ( x − 1 ) \therefore pa\times T=\sum\limits_{x=1}^\infty pa^x\times (x-1) ∴pa×T=x=1∑∞pax×(x−1)
x x x 变为 x − 1 x-1 x−1 的原因是 x x x 变为 1 1 1 开始。
∵ T = ∑ x = 1 ∞ p a x × x + p a 0 × 0 = ∑ x = 1 ∞ p a x × x \because T=\sum\limits_{x=1}^\infty pa^x\times x+pa^0\times0=\sum\limits_{x=1}^\infty pa^x\times x ∵T=x=1∑∞pax×x+pa0×0=x=1∑∞pax×x
∴ ( 1 − p a ) × T = ∑ x = 1 ∞ p a x \therefore (1-pa)\times T=\sum\limits_{x=1}^\infty pa^x ∴(1−pa)×T=x=1∑∞pax
设 S = ∑ x = 0 ∞ p a x S=\sum\limits_{x=0}^\infty pa^x S=x=0∑∞pax。
∴ p a × S = ∑ x = 1 ∞ p a x \therefore pa\times S=\sum\limits_{x=1}^\infty pa^x ∴pa×S=x=1∑∞pax
∵ S = ∑ x = 1 ∞ p a x + p a 0 = ∑ x = 1 ∞ p a x + 1 = T + 1 \because S=\sum\limits_{x=1}^\infty pa^x+pa^0=\sum\limits_{x=1}^\infty pa^x+1=T+1 ∵S=x=1∑∞pax+pa0=x=1∑∞pax+1=T+1
∴ ( 1 − p a ) S = p a 0 = 1 \therefore (1-pa)S=pa^0=1 ∴(1−pa)S=pa0=1
S = 1 1 − p a = T + 1 S=\dfrac{1}{1-pa}=T+1 S=1−pa1=T+1
∴ T = 1 1 − p a − 1 = p a p b \therefore T=\dfrac{1}{1-pa}-1=\dfrac{pa}{pb} ∴T=1−pa1−1=pbpa
∴ f i , j ( i + j ≥ k ) = i + j + p a p b \therefore f_{i,j(i+j\ge k)}=i+j+\dfrac{pa}{pb} ∴fi,j(i+j≥k)=i+j+pbpa
Sol2
对于 f i , j f_{i,j} fi,j 和 f i + 1 , j f_{i+1,j} fi+1,j( i + j ≥ k i+j\ge k i+j≥k):
由于后面的 b
终止前,新的 a
产生的多余 ab
期望数都是一样的。
所以两期望的区别只有当前 a
相差
1
1
1 造成的期望
1
1
1。
即 f i + 1 , j = f i , j + 1 f_{i+1,j}=f_{i,j}+1 fi+1,j=fi,j+1。
∵ i + j ≥ k \because i+j\ge k ∵i+j≥k
∴ f i , j + i = i + j \therefore f_{i,j+i}=i+j ∴fi,j+i=i+j
∴ f i , j = p a × ( f i , j + 1 ) + p b × ( i + j ) \therefore f_{i,j}=pa\times(f_{i,j}+1)+pb\times(i+j) ∴fi,j=pa×(fi,j+1)+pb×(i+j)
( 1 − p a ) × f i , j = p a + p b × ( i + j ) (1-pa)\times f_{i,j}=pa+pb\times(i+j) (1−pa)×fi,j=pa+pb×(i+j)
p b × f i , j = p a + p b × ( i + j ) pb\times f_{i,j}=pa+pb\times(i+j) pb×fi,j=pa+pb×(i+j)
f i , j = p a p b + i + j f_{i,j}=\dfrac{pa}{pb}+i+j fi,j=pbpa+i+j
Code
#include<bits/stdc++.h>
using namespace std;
#define mo 1000000007
#define int long long
int k,a,b,pa,pb;
int f[1010][1010];
int po(int x,int y){
int z=1;
while(y){
if(y%2) z*=x;
x*=x;
x%=mo,z%=mo;
y/=2;
}
return z;
}
signed main(){
cin>>k>>a>>b;
pa=a*po(a+b,mo-2)%mo;
pb=b*po(a+b,mo-2)%mo;
for(int i=k;i>=1;i--){
for(int j=k;j>=0;j--){
if(i+j>=k){
f[i][j]=pa*po(pb,mo-2)%mo+i+j;
f[i][j]%=mo;
}else{
f[i][j]=f[i+1][j]*pa%mo+f[i][j+i]*pb%mo;
f[i][j]%=mo;
}
}
}
cout<<f[1][0];
return 0;
}