题解 P5104 【红包发红包】

2018-12-16 19:52:36


首先看题:

抢红包能抢到的钱就是 $[0,w]$ 等概率均匀随机出的一个数 $x$。请问第 $k$ 个人期望抢到多少钱?

题目中涉及一个概念叫期望。如果您不知道什么是期望,请阅读这段文字。设一个离散型随机变量 $x$ 所有可能的取值分别为 $x_1,x_2,x_3,...,x_n$,这些值得对应概率是 $p_1,p_2,p_3,...,p_n$,则 $E(x)=x_1p_1+x_2p_2+...+x_np_n$ 叫做这个离散型随机变量 $x$ 的均值数学期望(简称期望)。(摘自人教版数学课本)

通俗的讲,第 $k$ 个人期望获得的钱就是所有这个人可能获得的钱的平均值。所以:

  1. 第 $1$ 个人领红包之前,剩余金额 $w$,期望领到的红包为 $\Large\frac{w}{2}$。
  2. 第 $2$ 个人领红包之前,剩余金额 $\Large\frac{w}{2}$,期望领到的红包为 $\Large\frac{w}{4}$。
  3. 第 $3$ 个人领红包之前,剩余金额 $\Large\frac{w}{4}$,期望领到的红包为 $\Large\frac{w}{8}$。
  4. 第 $4$ 个人领红包之前,剩余金额 $\Large\frac{w}{8}$,期望领到的红包为 $\Large\frac{w}{16}$。
  5. ……

所以,第 $k$ 个人期望领到的红包为 $\Large\frac{w}{2^k}$。由于需要对 $p=10^9+7$ 取模,所以答案转化为求 $w$ 与 $2^k$ 在模 $p$ 意义下的逆元的乘积。

逆元可以用快速幂求。

const int p = 1e9 + 7.5;

int qpow(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) (res *= a) %= p;
        (a *= a) %= p;
        b >>= 1;
    }
    return res % p;
}

int main() {
    int w = read(), n = read(), k = read();
    println(w * qpow(qpow(2, k), p - 2) % p);
}