CF992C 概率数学
CF992C Nastya and a Wardrobe
对 \(x\) 进行 \(k\) 次操作。对于每一次操作,有 \(50 \%\) 的概率 \(x \gets 2x\),否则 \(x \gets 2x - 1\)。求操作完后 \(2x\) 的期望得数。
推公式找规律。
| 操作次数 | \(x\) 取值区间 | 简化 |
|---|---|---|
| \(1\) | \([2x - 1, 2x]\) | \([2x - 1, 2x]\) |
| \(2\) | \([2 \times (2x - 1) - 1, 2 \times 2x]\) | \([2^2x - (2^2 - 1), 2^2x]\) |
| \(3\) | \([2 \times (2(2x - 1) - 1) - 1, 2 \times 2 \times 2x]\) | \([2^3x - (2^3 - 1), 2^3x]\) |
| \(\vdots\) | \(\vdots\) | \(\vdots\) |
| \(k\) | \([2^kx - (2^k - 1), 2^kx]\) |
(以上所有集合都只包括 自然数。)
可以发现,在第 \(i\) 步,\(x\) 平均 分布于 \([2^ix - 2^i + 1, 2^ix]\),就相当于取平均数。在 \(k\) 步内,\(x\) 的期望就是
\[\begin{aligned}
&\dfrac{(2^kx - 2^k + 1) + (2^kx)} 2 \\
=~ &\dfrac{2^{k + 1}x - 2^k + 1}2
\end{aligned}
\]
题目取的是 \(2x\) 的期望,刚好把分母消掉。
保险起见,开 int128。GNU C++17 代码。
最后我们请出万能 Python——
x, k = map(int, input().split()); print((0, (x * pow(2, k + 1, 10 ** 9 + 7) - pow(2, k, 10 ** 9 + 7) + 1) % (10 ** 9 + 7))[x != 0])

浙公网安备 33010602011771号