JZOJ3377 【NOI2013模拟】抽奖(lottery) 期望的线性性

题目大意

N 位同学参与抽奖,每位同学在抽奖箱中放入了Ai写有自己姓名的小球。抽奖总共有 M 轮,每轮随机地抽出一个小球并记录。之后,将这个小球放回抽奖箱。每位同学如果写有他的名字的球被抽出了X次,则他将获得奖金 X2 元。现在要求计算总奖金的期望值和获得奖金大于0的人数的期望值。

N,M105
Ai109

解题思路

先设 pi 表示一个抽到第 i 个人的概率。
我们把每次抽奖分开考虑,假设我们之前已经抽了t个球,现在我们设 t+1 个球抽到第 i 个人,这个人已经被抽到mi次。那么这一个球带来的贡献 Δ=(mi+1)2m2i=2mi+1 。那么我们考虑对两边求期望,根据期望的线性性

E[Δi]=E[2mi+1]=2E[mi]+1E[mi]=tpi

所以 E[Δi]=2tpi+1 。那么对于一个一次抽奖的期望就很好计算了:
E[Δ]=i=1N(piE[Δi])=i=1N(2tp2i+pi)=2ti=1Np2i+1

那么对于第一问的答案只需把 t=1...N 的情况加起来就可以了。
Ans1=t=0M1(2ti=1Np2i+1)=2(t=0M1t)(i=1Np2i)+M=M(M1)i=1Np2i+M

同样对于第二问也十分好求,由于期望的线性性,我们考虑对每个人分开考虑然后加起来,显然
Ans2=i=1N[1(1pi)M]=Ni=1N(1pi)M

程序

//YxuanwKeith
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 1e5 + 5;

int N, M, Num[MAXN];
double P[MAXN];

double Power(double x, int y) {
    double Ans = 1;
    for (; y; y >>= 1, x = x * x) 
        if (y & 1) Ans = Ans * x;
    return Ans;
}

int main() {
    scanf("%d%d", &N, &M);
    int All = 0;
    for (int i = 1; i <= N; i ++) {
        scanf("%d", &Num[i]);
        All += Num[i];
    }
    for (int i = 1; i <= N; i ++) P[i] = 1.0 * Num[i] / All;
    double Ans = 1.0 * M * (M - 1);
    double Sum = 0;
    for (int i = 1; i <= N; i ++) Sum += P[i] * P[i];
    Ans = Ans * Sum + M;
    printf("%.2lf\n", Ans);
    Ans = N;
    for (int i = 1; i <= N; i ++) Ans -= Power(1 - P[i], M);
    printf("%.2lf\n", Ans);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值