CF908D New Year and Arbitrary Arrangement 题解

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的子序列(ab不一定相邻)时停止。

求序列最终的 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 ia j j jb t t tab时的期望。

发现当前有 i i ia时,再加一个 b会产生 i i iab,与之前 b的数量无关,所以省去一维 dp

f i , j f_{i,j} fi,j 表示有 i i ia j j jab时的期望。

由于我们只知道终止状态,所以倒推会更好写且容易理解。

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+jk,此时只要再加一个 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+jk)=i+j+x=0pax×pb×x

x x xa的出现次数,a每多在 b前出现一次,最后的 ab就会多一个,所以总共加了 i + j + x i+j+x i+j+xab

继续推:

= 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=0pax×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+(1pa)×x=0pax×x

T = ∑ x = 0 ∞ p a x × x T=\sum\limits_{x=0}^\infty pa^x\times x T=x=0pax×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=1pax×(x1)

x x x 变为 x − 1 x-1 x1 的原因是 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=1pax×x+pa0×0=x=1pax×x

∴ ( 1 − p a ) × T = ∑ x = 1 ∞ p a x \therefore (1-pa)\times T=\sum\limits_{x=1}^\infty pa^x (1pa)×T=x=1pax

S = ∑ x = 0 ∞ p a x S=\sum\limits_{x=0}^\infty pa^x S=x=0pax

∴ p a × S = ∑ x = 1 ∞ p a x \therefore pa\times S=\sum\limits_{x=1}^\infty pa^x pa×S=x=1pax

∵ 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=1pax+pa0=x=1pax+1=T+1

∴ ( 1 − p a ) S = p a 0 = 1 \therefore (1-pa)S=pa^0=1 (1pa)S=pa0=1

S = 1 1 − p a = T + 1 S=\dfrac{1}{1-pa}=T+1 S=1pa1=T+1

∴ T = 1 1 − p a − 1 = p a p b \therefore T=\dfrac{1}{1-pa}-1=\dfrac{pa}{pb} T=1pa11=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+jk)=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+jk):

由于后面的 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+jk

∴ 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) (1pa)×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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值