http://www.aichengxu.com/other/1640203.htm
题目大意: N个奖品,M个人,求被给出去的奖品数量的期望。
对于M个人来说,拿到奖品的概率为Y[i],不拿到奖品的概率为N[i], 因为这两个事件是对立的,所以 N[i]=1-Y[i];
第i个拿到奖品的人概率,可由第i-1个人没拿到奖品和拿到奖品两种状态推出来。
Y[i]=N[i-1]*Y[i-1]+Y[i-1]*(Y[i-1]-1/n);
#include<iostream> #include<cstdio> #define maxn 1000005 using namespace std; double Y[maxn],N[maxn]; int main() { double n,m; //freopen("kids.in", "r", stdin); //freopen("kids.out", "w", stdout); scanf("%lf%lf",&n,&m); double ans=1; Y[1]=1; N[1]=0; for(int i=2;i<=m;i++) { Y[i]=N[i-1]*Y[i-1]+Y[i-1]*(Y[i-1]-1.0/n); N[i]=1-Y[i]; ans+=Y[i]; } printf("%.10f ",ans); return 0; }
正难则反:求被给出去的奖品数量的期望,就是总数-没给出去的奖品的数量的期望。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int main() { //freopen("kids.in", "r", stdin); //freopen("kids.out", "w", stdout); double n,m; while( scanf("%lf%lf",&n,&m)!=EOF) { double p=(n-1)/n; double ans=n*(1-pow(p,m)); printf("%.10f ",ans); } return 0; }