Processing math: 67%

bzoj 2554 Color 概率与期望

这道题是真的考验得分技巧

如果n<=5,那么直接用随机数模拟

n大一点的时候呢?

我们分开单独考虑每一个颜色

考虑一个颜色时,可以把这个颜色看成白球,其他颜色看成黑球,我们要求的就是全部变成白球的期望步数,此时我们设f[i]为当前有i个白球,全部变成白球的期望步数

而且我们每次操作不一定会出现黑变白或白变黑的情况,发生这种情况的概率是2i(ni)n(n1)(假设当前有i个白球),就相当于进行n(n1)2i(ni)次操作才能发生颜色改变。

我们就能写下f[i]=n(n1)2i(ni)+12f[i+1]+12f[i1]

但这是错的。

因为我们发现有的时候会出现全部变成黑球的情况,所以这是个条件概率。

设目前有i个白球,最后能全变成白球的概率是g[i],显然g[0]=0,g[n]=1,g[i]=g[i1]+g[i+1]2

显然g数组就是个等差数列,g[i]=in

按照比例把概率中的1分给f[i1]f[i+1]

我们就能写下f[i]=n(n1)2i(ni)+i12if[i1]+i+12if[i+1]

这就是对的了。

我们可以用高斯消元处理,时间复杂度为O(n3)

但这题n<=10000

这时候就要用到线性高斯消元的技巧了

f[i]=k[i]f[i+1]+b[i]

考虑利用这个式子将上面方程进行消元,将这个式子中带入方程右边的第二项,得到

f[i]=n(n1)2i(ni)+i12ik[i1]f[i]+i12ib[i1]+i+12if[i+1]

(1i12ik[i1])f[i]=i+12if[i+1]+i12ib[i1]+n(n1)2i(ni)

f[i]=i+12i1i12ik[i1]f[i+1]+i12i1i12ik[i1]b[i1]+n(n1)2i(ni)1i12ik[i1]

f[i]=k[i]f[i+1]+b[i]相比,可得

k[i] = \frac{\frac{i+1}{2i}}{1-\frac{i-1}{2i}k[i-1]}

b[i] = \frac {\frac {i-1}{2i}b[i-1]+\frac {n(n-1)}{2i(n-i)}}{1-\frac {i-1}{2i}k[i-1]}

然后由于f[0]没有意义,就无需从此转移,所以得到特殊情况

f[1]=\frac {n(n-1)}{2\times 1\cdot (n-1)}+f_2=\frac n2+f[2]

又由于f[1]=k[1]f[2]+b[1],可以得到在i=1下的特殊情况:

k[1]=1

b[1]=\frac {n}{2}

然后求出f[i]就能求出答案了。

代码极短

posted @   wljss  阅读(183)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示