网上看到的一种写法
原博客链接(后面写法会有点不一样)
原问题可以变成:
有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} ,ige 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)!)的话,很显然,我们是按顺序一个一个塞满的。