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\) 的期望,刚好把分母消掉。

保险起见,开 int128GNU 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])

一行 AC

posted @ 2023-12-25 21:14  Carrot-Meow~  阅读(21)  评论(0)    收藏  举报