牛逼题

calc by smallbasic

前言

拜谢smallbasic, 出的神题, 故写题解以记之。

题解

考虑各个数都在各自的范围内随机取值, 并且可以是实数, 这就很困难。 我们可以将其拆开, 得:

\(X = \sum \lfloor x_i \rfloor , Y = \lfloor \sum (x_i) \rfloor\)

\[(X + Y)^k = \sum_{i = 0}^k \dbinom k i X^i Y^{k - i} \]

从而把期望套上去则有:

\[\begin{aligned} E((X + Y)^k) &= E(\sum_{i = 0}^k \dbinom k i X^i Y^{k - i}) \\ &= \sum_{i = 0}^k \dbinom k i E(X^i) E(Y^{k - i}) \end{aligned} \]

因为完全随机, 所以小数和整数个随个的, 所以期望可以拆开。

\[E(X^j) = E((\sum \lfloor x_i \rfloor)^j) \]

这个东西我们尝试DP, $ dp_{i, j} $ 就是考虑前 \(i\)\(x\)\(E(X_i^j)\)。 我们把这个式子拆开搞。

\[\begin{aligned} E(X_i^j) &= E((X_{i - 1} + x_i)^j) \\ &= E(\sum_{t = 0}^j \dbinom j t X_{i - 1}^t x_i^{j - t}) \\ &= \sum_{t = 0}^j \dbinom j t E(X_{i - 1}^t) E(x_i^{j - t}) \\ &= \sum_{t = 0}^j \dbinom j t dp_{i - 1, t} E(x_i^{j - t}) \end{aligned} \]

因为 \(x_i\) 是独立的, 随机的, 可以搬出来。

现在就要算 \(E(x_i^j)\) 这个东西, 我们可以根据定义算, 就是 $$ E(x_i^j) = \sum w^j P(w) = \frac{\sum_{t = l_i}^{r_i - 1} t^j}{r_i - l_i} $$

这个东西要快速算 \(O(k)\) 可以用拉插。

然后就剩下小数 \(E((\lfloor \sum (x_i) \rfloor)^j)\) 了。

同样的我们用定义式计算, \(E((\lfloor \sum (x_i) \rfloor)^j) = \sum w^j P(w)\)

这个东西我们只能转化, 令 \(s_i = \lfloor \sum_{j = 0}^i x_j \rfloor, \ t_i = (s_i)\)。 我们发现 \(s_i = s_{i - 1} + 1\) 等价于 \(t_i < t_{i - 1}\)。 这一步非常的妙。

由于 \(t_i\) 仍然是在 \([0, 1)\) 完全随机, 那么我们就可以将问题转化成 $(\lfloor \sum (x_i) \rfloor) = $ 我随机生成的 \(t\) 序列的相邻逆序对个数。 可以发现 \(t_i\) 在实数域内完全随机, 两个数相同是不可能事件, 也就转化成 \(t\) 序列互不相同, 也每个数出现概率相同, 那么我们就可以根据相对大小把它映射成一个排列。

所以我们就转化成了随机生成一个排列, 里面的相邻逆序对个数就是 \((\lfloor \sum (x_i) \rfloor)\)

于是就可以设计DP。

比较难设计的是我们不知道放在哪里会产生什么贡献, 所以多设计一维就是已经考虑的排列中有多少相邻逆序对, 并且我们从小到大的插数。

那么就会得到转移方程:

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

posted @ 2024-07-31 11:57  qqrj  阅读(12)  评论(0编辑  收藏  举报