Loading

P5104 红包发红包 连续性概率

P5104 红包发红包 连续性概率

链接

我们先考虑第一次抽红包。

显然,抽的钱数在 \((0,k]\) 之间的概率是 \(\frac k w\),再根据概率密度函数是概率分布函数的导数,我们可以求得概率密度函数为:

\[f(x)=\begin{cases} \frac 1 w &(0\le x\le w)\\ 0&x< 0,x>w \end{cases} \]

所以我们积分一下不难得出抽一次的期望:

\[E_1=\int_{i=0}^w xf(x)=\frac w 2 \]

我们现在考虑抽第二次。这里假设第一次抽取的钱为 \(a\) ,那么第二次抽钱期望抽到 \(\frac{w-a}2\)

那么抽第二次的期望就应该是:

\[E_2=\int_{i=0}^w \frac{w-a}2f(a)=\frac{w}4 \]

对于第三次,我们可以把前两次的抽取看做一次,具体来说,就设这个概率密度函数为 \(g\) ,虽然我们不知道 \(g\) 具体是什么,但是我们知道:

\[E_2=\int _{i=0}^w xg(x)=\frac{w}{4} \]

如此下去,可以得到第 \(k\) 次抽钱的期望是 \(\frac{w}{2^k}\)

打一个快速幂就过去了。

#include<bits/stdc++.h>
#define dd double
#define ld long double
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define N number
#define M number
using namespace std;

const int INF=0x3f3f3f3f;
const ll mod=1e9+7;

template<typename T> inline void read(T &x) {
    x=0; int f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c == '-') f=-f;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    x*=f;
}

inline ll ksm(ll a,ll b,ll mod){
    ll res=1;
    while(b){
        if(b&1) (res*=a)%=mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

int main(){
    ll w,n,k;read(w);read(n);read(k);
    ll inv=ksm(2,mod-2,mod);
    ll nowinv=ksm(inv,k,mod);
    printf("%lld\n",w*nowinv%mod);
    return 0;
}
posted @ 2021-07-08 10:17  hyl天梦  阅读(60)  评论(0编辑  收藏  举报