题目大意
N
位同学参与抽奖,每位同学在抽奖箱中放入了
N,M≤105
∑Ai≤109
解题思路
先设
pi
表示一个抽到第
i
个人的概率。
我们把每次抽奖分开考虑,假设我们之前已经抽了
E[Δi]=E[2mi+1]=2E[mi]+1E[mi]=t∗pi
所以 E[Δi]=2t∗pi+1 。那么对于一个一次抽奖的期望就很好计算了:
E[Δ]=∑i=1N(pi∗E[Δi])=∑i=1N(2t∗p2i+pi)=2t∑i=1Np2i+1
那么对于第一问的答案只需把 t=1...N 的情况加起来就可以了。
Ans1=∑t=0M−1(2t∗∑i=1Np2i+1)=2(∑t=0M−1t)(∑i=1Np2i)+M=M(M−1)∑i=1Np2i+M
同样对于第二问也十分好求,由于期望的线性性,我们考虑对每个人分开考虑然后加起来,显然
Ans2=∑i=1N[1−(1−pi)M]=N−∑i=1N(1−pi)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);
}