1 条题解
-
0
一、题意理解
我们有 张牌,第 种点数有 张,。
操作:每次随机选两张牌 和 ,把 的点数变为和 一样。
目标:所有牌点数相同(即全部变成同一种点数),问达到目标所需操作次数的期望。
二、模型抽象
这是一个随机过程,状态可以用一个向量 表示,其中 是点数 的牌的张数。
转移:
- 随机选两张牌 。
- 如果 和 点数相同,则状态不变。
- 如果 点数 , 点数 ,则 减少 , 增加 。
最终状态:某个 ,其他为 。
三、关键思路
这个问题是多个吸收态的马尔可夫链,通常需要解线性方程组,但 , 很大,不能直接 DP。
1. 对称性与线性性
设 为从状态 出发到结束的期望步数。
由于操作对称,我们期望可以写成 的形式,其中 是某种函数,表示当前有 张点数为 的牌对期望的贡献。
四、具体推导
1. 考虑只有两种点数的情况
假设只有点数 和 ,张数分别为 和 。
设 表示从 到达 张相同点数的期望步数。
转移:
- 选 为点数 , 为点数 :概率 ,状态变为 。
- 选 为点数 , 为点数 :概率 ,状态变为 。
- 其他情况:两张同点数,状态不变。
因此:
$$g(x) = 1 + \frac{x(n-x)}{n(n-1)} [g(x-1) + g(x+1)] + \left[1 - \frac{2x(n-x)}{n(n-1)}\right] g(x) $$化简得:
$$\frac{2x(n-x)}{n(n-1)} g(x) = 1 + \frac{x(n-x)}{n(n-1)} [g(x-1) + g(x+1)] $$即:
这是一个差分方程。
2. 差分方程求解
令 ,则:
即:
$$[g(x) - g(x-1)] - [g(x+1) - g(x)] = \frac{n(n-1)}{x(n-x)} $$所以:
于是:
$$h(k) = h(n) + \sum_{j=k}^{n-1} \frac{n(n-1)}{j(n-j)} $$注意 ,(因为已全是同一种点数)。
并且:
因为 。
又因为 ,所以 ,可解出 。
3. 简化
注意到:
$$\frac{1}{j(n-j)} = \frac{1}{n} \left( \frac{1}{j} + \frac{1}{n-j} \right) $$所以:
$$h(k) = h(n) + (n-1) \sum_{j=k}^{n-1} \left( \frac{1}{j} + \frac{1}{n-j} \right) $$设 为调和数 ,则:
$$\sum_{j=k}^{n-1} \frac{1}{n-j} = \sum_{t=1}^{n-k} \frac{1}{t} = H(n-k) $$于是:
4. 利用 求
代入 :
$$\sum_{i=1}^n \left\{ h(n) + (n-1) [H(n-1) - H(i-1) + H(n-i)] \right\} = 0 $$即:
$$n h(n) + (n-1) \sum_{i=1}^n [H(n-1) - H(i-1) + H(n-i)] = 0 $$但 ,或者更简单:对称性 ,不过我们已知 ,以及 $\sum_{i=1}^n H(n-i) = \sum_{i=0}^{n-1} H(i) = n H(n) - n$。
所以:
$$\sum_{i=1}^n [H(n-1) - H(i-1) + H(n-i)] = n H(n-1) - [n H(n) - n] + [n H(n) - n] = n H(n-1) $$因此:
5. 得到
$$h(k) = -(n-1) H(n-1) + (n-1)[H(n-1) - H(k-1) + H(n-k)] $$于是:
$$g(x) = \sum_{k=1}^x h(k) = (n-1) \sum_{k=1}^x [H(n-k) - H(k-1)] $$对于 从 到 , 就是从有 张某种点数的牌到全部同一种点数的期望步数。
六、回到原问题
原问题有 种点数,初始 张点数为 的牌。
我们可以将过程看作:最终会全部变成某一种点数 ,但是 是随机的,并且期望步数与最终是哪种点数有关。
一个关键结论(可由线性性推导):总期望步数 $E = \sum_{i=1}^m \left[ \frac{a_i}{n} \cdot g(a_i) \right]$ 的某种加权和。
实际上更精确是:总期望 = 从当前状态到全部同色的期望,等于每种颜色的贡献之和,而每种颜色的贡献是:假设最终全变成这种颜色,所需期望步数,按某种概率加权。经过推导(类似论文 “The coalescent process in models with selection and recombination” 或 “Ewens sampling formula” 相关),最终公式是:
$$E = \sum_{i=1}^m \left[ \frac{a_i (n-1)}{n} \cdot (n-1) - (a_i - 1)(n-1) + (n - a_i)(n-1) \left( H(n-1) - H(n - a_i) \right) \right] $$整理后就是代码中的形式。
七、代码解析
D ans = 0; cin >> n >> m; rep(i, 1, m) { int x; cin >> x; // a_i ans += 1.L * x * (n - 1) / n * (n - 1) // 第一部分 - 1.L * (x - 1) * (n - 1) // 第二部分 + 1.L * (n - x) * (n - 1) * (H(n - 1) - H(n - x)); // 第三部分 }对应公式:
$$\text{贡献} = \frac{x(n-1)^2}{n} - (x-1)(n-1) + (n-x)(n-1)\left(H_{n-1} - H_{n-x}\right) $$其中 是调和数。
八、调和数计算优化
,不能直接算 。
$$H_n \approx \ln n + \gamma + \frac{1}{2n} - \frac{1}{12n^2} + \cdots $$
用近似公式:代码中预计算前 项的精确值,对于 用 近似。
九、总结
- 将问题转化为两种颜色的期望步数 。
- 通过差分方程和调和数得到 的表达式。
- 利用线性性将多颜色期望表示为各 的贡献和。
- 用调和数近似处理 很大的情况。
最终算法复杂度 ,可以处理 高达 的情况。
这是一道经典的概率期望+调和数+对称性化简题,核心在于发现两种颜色的子问题可解,并利用线性性推广到多颜色。
- 1
信息
- ID
- 6088
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者