bzoj 2554 Color 概率与期望
这道题是真的考验得分技巧
如果n<=5,那么直接用随机数模拟
n大一点的时候呢?
我们分开单独考虑每一个颜色
考虑一个颜色时,可以把这个颜色看成白球,其他颜色看成黑球,我们要求的就是全部变成白球的期望步数,此时我们设f[i]为当前有i个白球,全部变成白球的期望步数
而且我们每次操作不一定会出现黑变白或白变黑的情况,发生这种情况的概率是2i(n−i)n(n−1)(假设当前有i个白球),就相当于进行n(n−1)2i(n−i)次操作才能发生颜色改变。
我们就能写下f[i]=n(n−1)2i(n−i)+12f[i+1]+12f[i−1]
但这是错的。
因为我们发现有的时候会出现全部变成黑球的情况,所以这是个条件概率。
设目前有i个白球,最后能全变成白球的概率是g[i],显然g[0]=0,g[n]=1,g[i]=g[i−1]+g[i+1]2
显然g数组就是个等差数列,g[i]=in
按照比例把概率中的1分给f[i−1]和f[i+1]
我们就能写下f[i]=n(n−1)2i(n−i)+i−12if[i−1]+i+12if[i+1]
这就是对的了。
我们可以用高斯消元处理,时间复杂度为O(n3)
但这题n<=10000
这时候就要用到线性高斯消元的技巧了
设f[i]=k[i]f[i+1]+b[i]
考虑利用这个式子将上面方程进行消元,将这个式子中带入方程右边的第二项,得到
f[i]=n(n−1)2i(n−i)+i−12ik[i−1]f[i]+i−12ib[i−1]+i+12if[i+1]
(1−i−12ik[i−1])f[i]=i+12if[i+1]+i−12ib[i−1]+n(n−1)2i(n−i)
f[i]=i+12i1−i−12ik[i−1]f[i+1]+i−12i1−i−12ik[i−1]b[i−1]+n(n−1)2i(n−i)1−i−12ik[i−1]
和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]就能求出答案了。
代码极短
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步