cf div3 1084 G(dp + 组合数学 + 期望计算)
G. Operation Permutation
补了半天这道题,感觉做出这道题需要对拆分贡献和期望计算有足够的理解。
显然 \(-、/\) 可以分别等价地替换成 \(+、*\)。这样,整个序列中只包含 \(2\) 种操作。
考虑对于任意一种可能的操作序列,拆分形式。
例如:\([a_{1},m_{1},m_{2},a_{2},a_{3},m_{3},a_{4}]\):
把括号去掉:
显然 \(x\) 的贡献是恒定的(即考虑所有的乘法操作),可以留到最后计算。对于 \(\forall a_{i}\),它的贡献等于 \(a_{i}\) 乘以 其后面所有 \(m_{i}\) 的乘积。
而对于任意一种操作序列,每个 \(a_{i}\) 都是等价的(可以任意互换),那么每个 \(a_{i}\) 后面 \(m_{i}\) 的任意一种分布的可能性也是相同的。于是,我们可以将所有的 \(a_{i}\) 归一化,使得接下来只需要考虑乘法操作对期望的贡献,最终乘以 \(sum(a)\) 就是答案。
(上述分析的另一种理解方式:由于每个 \(a_{i}\) 的贡献只和它后面有哪些 \(m_{i}\) 有关,我们可以将每一项 \(a_{i}\) 独立看待,只考虑它后面所有 \(m_{i}\) 的分布情况。于是问题分成 \(N\) 个形式相同的子问题,唯一不同在于 \(a_{i}\) 的值不同;所有子问题答案的总和即为整个问题的答案)
考虑某个 \(a_{i}\) 后面恰好有 \(j\) 个 \(m_{i}\) 的概率:我们只考虑 \(a_{i}\) 和所有 \(m_{i}\)(假设共 \(M\) 项 \(m_{i}\),总共有 \(M+1\) 个数),对于所有可能的排列,即 \(a_{i}\) 和所有 \(m_{i}\) 的全排列。显然对于任意 \(0\leq k\leq M\),\(a_{i}\) 后面恰好有 \(k\) 个 \(m_{i}\) 的概率是相等的(即 \(a_{i}\) 作为其中第 \(k+1\) 项的概率),均为 \(\frac{1}{M+1}\)。
于是考虑计算:从 \(M\) 个 \(m_{i}\) 中挑出恰好 \(j\) 个(即子集大小恰好为 \(j\)),所有可能方案的子集乘积的总和,设为 \(dp_{j}\)。由于总共有 \({C_{M}^{j}}\) 种选法,故期望为 \(\frac{dp_{j}}{C_{M}^{j}}\)。那么所有 \(a_{i}\) 对期望的总贡献就能表示为:
\(dp_{j}\) 也容易计算(先用二维 dp 表示以便于分析):\(dp_{i,j}\) 表示考虑 \(m_{1\backsim i}\),所有大小为 \(j\) 的子集乘积的总和。依次决策每一个 \(m_{i}\) 是否被选入子集。
最后别忘了加上 \(x\) 的贡献。具体实现见 code。

浙公网安备 33010602011771号