LOJ6267 生成随机数
Link 先考虑 \(m=2^k\) 的情况。 首先我们可以设计一种可行的策略:连续抛 \(k\) 次硬币得到 \(2^k\) 种结果,而每个数 \(i\) 对应其中 \(a_i\) 种。 不难发现每个数对应的一些结果是可以合并的,即扔不到 \(k\) 就能确定是哪个数。 可以证明最优的合并方案的结果就是 \(\frac{a_i}m\) 在 \(2\) 进制下的各个 \(1\) 位。 对于每个 \(a_i\) ,设 \(\frac{a_i}m=\sum\limits_{x\in S(a_i)}\frac1{2^x}\) ,那么结果就是 \(\sum\limits_{i=1}^n\sum\limits_{x\in S(a_i)}\frac x{2^x}\) 。 然后考虑 \(m\ne2^k\) 的情况。 简单推理可以发现,此时有一些结果不会对应任何一个数,也就是说 \(S(x)\) 可能变成了一个无限集,但是 \(m=2^k\) 时的结论依旧适用。 记 \(f(\frac xm)=\sum\limits_{i\in S(x)}\frac i{2^i}\) ,那么答案就是 \(\sum\limits_{i=1}^nf(\frac{a_i}m)\) 。 但是直接求 \(f\) 看上去不太现实,我们发现 \(f(2x-\lfloor2x\rfloor)=2f(x)-2x\)