TsinsenA1489 抽奖 【期望】

题目分析:

问题可以转化成将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减,然后加起来。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 105000;
 5 
 6 int n,m;
 7 int a[maxn],tot;
 8 
 9 double fast_pow(double now,int pw){
10     double ans = 1,dt = now;int bit = 1;
11     while(bit <= pw){
12     if(bit & pw){ans = ans*dt;}
13     dt = dt*dt; bit<<=1;
14     }
15     return ans;
16 }
17 
18 void solve1(){
19     double um = 0;
20     for(int i=1;i<=n;i++){
21     double now = (double)a[i]/(double)tot;
22     um += now*now;
23     }
24     double ans = 0;
25     for(int i=0;i<m;i++){ans += (1+2*i*um);}
26     printf("%.2lf
",ans);
27 }
28 
29 void solve2(){
30     double ans = 0;
31     for(int i=1;i<=n;i++){
32         double p = (double)(tot-a[i])/(double)tot;
33     p = fast_pow(p,m);
34     p = 1-p;
35     ans += p;
36     }
37     printf("%.2lf
",ans);
38 }
39 
40 int main(){
41     scanf("%d%d",&n,&m);
42     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
43     for(int i=1;i<=n;i++) tot += a[i];
44     solve1();
45     solve2();
46     return 0;
47 }
原文地址:https://www.cnblogs.com/Menhera/p/10404673.html