1. 程式人生 > >P5104 紅包發紅包

P5104 紅包發紅包

題目看錯見祖宗系列

題目的意思是給你一個\(w\)元的紅包,第\(i\)個搶的人的錢數是從0到剩下的錢中隨機的一個數。然後叫你求第\(k\)個人搶到錢的期望。

顯然答案就是\(\frac{w}{2^k}\)。套上有理數取膜的模板即可求到答案了。

注意:這裡的\(2^k\)不能用1左移,畢竟\(k\)辣麼大。\(k\)不是小於10啊!看清題目!

程式碼:

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

#define ll long long
const ll MOD = 1e9 + 7; 
ll w, n, k;

ll pow_mod(ll x, ll y, ll z)
{
    ll ans = 1; x %= z;
    while(y)
    {
        if(y & 1) ans = ans * x % z;
        x = x * x % z;
        y >>= 1;
    }
    return ans % z;
}
ll inv(ll a, ll p)
{
    return pow_mod(a, p - 2, p);
}
int main()
{
    cin >> w >> n >> k;
    cout << w * inv(pow_mod(2, k, MOD), MOD) % MOD << endl;
    return 0;
}