题意:
n个礼物盒子,m个人去开盒子,每个盒子只有第一次被打开才能拿走里面的礼物。
m个人拿走的礼物数量的期望值。
题目分析:
设d[i]表示第i个人拿到礼物的概率。
结果显然是
已知d[i]当我们需要处理d[i+1]时。
当d[i+1] = (1-d[i])*d[i]+d[i]*(d[i]-1/n)
1.当第i个人拿不到礼物概率为1-d[i],第i+1个人拿到礼物的概率等于d[i-1]
2.当第i个人拿到礼物概率为d[i],第i+1拿到礼物的概率等于d[i]-1/n。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
double d[100005];
int n,m;
scanf("%d%d",&n,&m);
d[1]=1;
for(int i=2;i<=m;i++){
d[i]=(1-d[i-1])*d[i-1]+d[i-1]*(d[i-1]-1.0/n);
}
double res=0;
for(int i=1;i<=m;i++)res+=d[i];
printf("%.9f\n",res);
}