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