TsinsenA1489 抽奖 【期望】

时间:2023-12-11 23:52:32

题目分析:

问题可以转化成将m个球放进n个盒子里,每个盒子的贡献为盒子中球数的平方。

第一问考虑增量。

对于一个原本有$x$个球的盒子,新加一个球的贡献是$2x+1$。期望条件下仍然满足。

第$i$个球加进第$j$个盒子的概率是$\frac{a[j]}{tot}$,而第$j$个盒子球数的期望是$\frac{a[j]*(i-1)}{tot}$。

所以答案就是

$$\sum_{i=0}^{n}(1+2*i*\sum_{j=1}^{m}\frac{a[j]^2}{tot^2})$$

后面的$\sum$预处理出来。

第二问考虑每个盒子没有任何一个球,那么把球放到其它盒子里,求出概率拿1减,然后加起来。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,m;
int a[maxn],tot; double fast_pow(double now,int pw){
double ans = ,dt = now;int bit = ;
while(bit <= pw){
if(bit & pw){ans = ans*dt;}
dt = dt*dt; bit<<=;
}
return ans;
} void solve1(){
double um = ;
for(int i=;i<=n;i++){
double now = (double)a[i]/(double)tot;
um += now*now;
}
double ans = ;
for(int i=;i<m;i++){ans += (+*i*um);}
printf("%.2lf\n",ans);
} void solve2(){
double ans = ;
for(int i=;i<=n;i++){
double p = (double)(tot-a[i])/(double)tot;
p = fast_pow(p,m);
p = -p;
ans += p;
}
printf("%.2lf\n",ans);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) tot += a[i];
solve1();
solve2();
return ;
}