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;
}

猜你喜欢

转载自www.cnblogs.com/Garen-Wang/p/10161854.html