UR#19 通用评测号
网上看到的一种写法
原博客链接(后面写法会有点不一样)
原问题可以变成:
有n个容量无限大的燃料箱,每次随便放(达到A了仍然可以继续放),当所有燃料都达到B时结束。求燃料箱所放燃料\(\ge A\)的期望数量。
正确性:
首先,期望只与终态有关。那么,对于一个燃料\(\ge A\)的箱子,我再往里放一个的话,并不会改变其他燃料\(<A\)的状态。因此,此次操作并不会对状态产生影响。那么这个转化是正确的。
根据期望的线性性质,每个燃料箱的贡献为1,那么就是其\(\ge A\)的概率。而每个燃料箱是等价的,我们把概率\(× n\)就是答案了。
考虑燃料箱有贡献的情形:其刚好达到\(A\),并且其余燃料箱存在至少一个燃料小于\(B\)。
显然,我们算出其余都\(\ge B\)的概率,然后拿1减去就好了。
可以发现,如果一个燃料箱已经\(\ge B\)了,再往里放一个并不会改变其他燃料\(<B\)的状态。所以,当一个燃料箱达到B时,我们就假定它损坏了,不能往里面加燃料了。
考虑dp,记\(dp[i][j]\)表示此时已有\(i\)个燃料箱达到\(B\),总共加入的次数为\(j\)的概率。
转移:
\[dp[i][j]=dp[i][j]+\frac{dp[i][j-1]}{n-i}\\
dp[i][j]=dp[i][j]+\frac{dp[i-1][j-1]}{n-i+1}\cdot C_{j-1-(i-1)\cdot B}^{B-1} ,i\ge 1
\]
那么\((1-(n-1)!\cdot dp[n-1][(n-1)\cdot B+A-1])\cdot n\)就是答案了。
对于dp部分的一些解释:
首先,第一条转移方程,注意的是,我们并不是真的的往燃料箱里塞燃料,而是预留一个塞燃料的操作,由于只能选择一个点,所以概率要除以\(n-i\)。
第二条转移方程,我们把第\(j\)个操作并且在前面\(j-1-(i-1)\cdot B\)个预留操作中选择\(B-1\)个,把其塞满。
至于乘上\((n-1)!\)的话,很显然,我们是按顺序一个一个塞满的。