4 月 11 日记录

生成随机数

考虑 \(m=2^k\) 的情形。此时相当于有一棵 \(k+1\) 层的满二叉树,我们要把 \(n\) 种颜色分配给每个叶结点。假设第 \(i\) 层有 \(c_i\) 个子树内部颜色不全相同,期望情况下需要投掷的次数是 \(\sum_{i=0}^k 2^{-i}c_i\)。最优分配的答案可以由一个式子计算得到:\(k-\sum_{i=1}^n\sum_{j\in bit(a_i)}2^{-(k-j)}j\)

否则,考虑 \(m=m'2^k\),其中 \((m,m')=1\)。将 \(m\) 扩展到最小的 \(2^t\) 不能保证是最优的方法。尝试思考这样做为什么是错误的:一个简单的反例是 \(c=\{3,3\}\)。问题的核心在于约分——只需要保证最后得到与给定相同的概率分布。先约去 \(m\)\(a_i\) 的公因子,然后考虑将它变换为一个分数 \(\frac{ta_i}{tm}\),其中 \(t\in \N^+\)。找到最小的 \(2^k\ge tm\)。结论是最优的 \(t\) 一定使得 \(2^k-tm\) 最小。注意 \(k\) 可能是 \(O(m)\) 量级的。令 \(r=2^k\bmod m\),即最小化 \(r\)。找到 \(r\) 后就可以按照 \(m=2^k\) 的式子 \(O(nm)\) 算出答案。(实际上由于 \(\sum a_i=m\),不同的 \(a_i\) 只有 \(\sqrt{2m}\) 种,暴力是 \(O(m\sqrt m)\) 的。)

优化到 \(O(m)\) 是容易的,将 \(i\to 2i\bmod m\) 连边,会构成一棵基环内向树。求从 \(a_i\)\(k\) 步的信息和。简单倍增时间 \(O(m\log m)\),空间线性,但是无法通过,甚至没有 \(O(m\sqrt m)\) 跑得快。做一些答辩分讨可以 \(O(m)\),谁写???

我写了,但是被卡空间了。


nfls ver.

首先考虑 \(m=2^k\) 的情况。此时相当于有一棵 \(k+1\) 层的满二叉树,我们要把 \(n\) 种颜色分配给每个叶结点。当一个子树内部只含一种颜色就没有必要继续下去。设第 \(i\) 层有 \(c_i\) 个子树内部颜色不全相同,期望情况下需要投掷的次数是 \(\sum_{i=0}^k 2^{-i}c_i\)。最优分配的答案可以由一个式子计算得到:\(k-\sum_{i=1}^n\sum_{j\in bit(a_i)}2^{-(k-j)}j\)

否则,考虑 \(m=m'2^k\),其中 \((m,m')=1\)。将 \(m\) 扩展到最小的 \(2^t\) 并不一定是最优的。尝试思考这样做为什么是错误的:一个简单的反例是 \(a=\{3,3\}\)。问题的核心在于约分——只需要最后得到与给定相同的概率分布,而不必让形态也完全固定。先约去 \(m\)\(a_i\) 的公因子,然后考虑将它变换为一个分数 \(\frac{ta_i}{tm}\),其中 \(t\in \N^+\)。找到最小的 \(2^k\ge tm\)。对于每个 \(a_i\),变成 \(ta_i\) 个叶子;剩下的 \(2^k-tm\) 个叶子就作为空叶子重新开始。结论是最优的 \(t\) 一定使得 \(2^k-tm\) 最小。注意 \(k\) 可能是 \(O(m)\) 量级的。令 \(r=2^k\bmod m\),即最小化 \(r\)。找到最小的 \(r\) 后就可以按照 \(m=2^k\) 的式子 \(O(nm)\) 算出答案。(实际上由于 \(\sum a_i=m\),不同的 \(a_i\) 只有 \(\sqrt{2m}\) 种,暴力是 \(O(m\sqrt m)\) 的。)

优化到 \(O(m)\) 是容易的,将 \(i\to 2i\bmod m\) 连边,会形成一棵基环内向树。我们给 \(2i\ge m\) 的边带上一个信息。考虑式子的本质就是求从 \(a_i\)\(k\) 步经过的边的信息和。只需要在基环树上做一些分讨即可做到 \(O(m)\)。注意不要因为求逆元而使复杂度退化。

posted @ 2025-04-11 16:33  Network_Error  阅读(14)  评论(0)    收藏  举报