加载中...

cf div3 1084 G(dp + 组合数学 + 期望计算)

G. Operation Permutation

补了半天这道题,感觉做出这道题需要对拆分贡献和期望计算有足够的理解。

显然 \(-、/\) 可以分别等价地替换成 \(+、*\)。这样,整个序列中只包含 \(2\) 种操作。

考虑对于任意一种可能的操作序列,拆分形式。

例如:\([a_{1},m_{1},m_{2},a_{2},a_{3},m_{3},a_{4}]\)

\[((x + a_{1})*m_{1}*m_{2}+a_{2}+a_{3})*m_{3}+a_{4} \]

把括号去掉:

\[(x*m_{1}*m_{2}*m_{3})+(a_{1}*m_{1}*m_{2}*m_{3})+(a_{2}*m_{3})+(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}\) 对期望的总贡献就能表示为:

\[sum(a) \times \frac{\sum_{j=0}^{M}\frac{dp_{j}}{C_{M}^{j}}}{M+1} \]

\(dp_{j}\) 也容易计算(先用二维 dp 表示以便于分析):\(dp_{i,j}\) 表示考虑 \(m_{1\backsim i}\),所有大小为 \(j\) 的子集乘积的总和。依次决策每一个 \(m_{i}\) 是否被选入子集。

\[dp_{i,j} = dp_{i-1,j} + m_{i}*dp_{i-1,j-1} \]

最后别忘了加上 \(x\) 的贡献。具体实现见 code。

code

posted @ 2026-02-28 15:54  小橘奏  阅读(42)  评论(0)    收藏  举报