题目链接传送门
题意:n个盒子里装有礼物,m个人随机选择礼物,选完之后空盒子放回。问选中的礼物数的期望。
题解
解法一:一个礼物m次不被选中的概率是 <nobr> (n1n)m </nobr>,那么不被选的期望就是 <nobr> n×(n1n)m </nobr>,所以用总数减去不被选的期望就是被选中礼物的期望
解法二:也可以用概率求期望,用 <nobr> f[i] </nobr>表示第 <nobr> i </nobr>个人得到礼物的概率,那么如果第 <nobr> i1 </nobr>个人没有得到礼物,那么第 <nobr> i </nobr>个人和第 <nobr> i1 </nobr>个人得到礼物的概率一样;反之,则第 <nobr> i </nobr>个人得到礼物的概率应该是第 <nobr> i1 </nobr>个人得到礼物的概率减去 <nobr> 1n </nobr>,由此可以得到递推式
<nobr> f[i]=(1f[i1])×f[i1]+f[i1]×(f[i1]1n) </nobr>
这道题的思路比较特殊
代码一

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> 
using namespace std;

int n,m;
double p,ans;

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        p=1.0*(n-1)/n;
        ans=n-n*pow(p,m);
        printf("%.10lf\n",ans);
    }
}

代码二

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> 
using namespace std;

const int N=100010;
int n,m;
double f[N],ans;

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        f[1]=1,ans=1;
        for(int i=2;i<=m;i++)
            f[i]=(1.0-f[i-1])*f[i-1]+f[i-1]*(f[i-1]-1.0/n),ans+=f[i];
        printf("%.10lf\n",ans); 
    }
    return 0;
}