牛逼题
calc by smallbasic
前言
拜谢smallbasic, 出的神题, 故写题解以记之。
题解
考虑各个数都在各自的范围内随机取值, 并且可以是实数, 这就很困难。 我们可以将其拆开, 得:
设 \(X = \sum \lfloor x_i \rfloor , Y = \lfloor \sum (x_i) \rfloor\)。
从而把期望套上去则有:
因为完全随机, 所以小数和整数个随个的, 所以期望可以拆开。
这个东西我们尝试DP, $ dp_{i, j} $ 就是考虑前 \(i\) 个 \(x\) 的 \(E(X_i^j)\)。 我们把这个式子拆开搞。
因为 \(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。
比较难设计的是我们不知道放在哪里会产生什么贡献, 所以多设计一维就是已经考虑的排列中有多少相邻逆序对, 并且我们从小到大的插数。
那么就会得到转移方程: