题目分析:
问题可以转化成将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 }