乔明达太神,其实已经题解非常清楚了,我再推一遍吧。
题目意思相当于有n个盒子,无差别投m次球,每个盒子的得分为每个盒子里的球的个数。
第一问:
假设这个球放在了第i个盒子里,那么 ?ans = (mi + 1) ^ 2 - mi ^ 2 --> ?ans = 2mi + 1
同时取期望 --> E(?i) = 2E(?mi) + 1
i这个盒子有mi个球(假设已经投出了t个球)的期望为 t * pi 代入 E(?i) = 2 * t * pi + 1
特殊到一般,对于任意的i,i = 当前这个选定的i 的概率为pi,那么 E(?) = sigma(pi * E(?i)),代入,E(?) = sigma(2 * t * pi ^ 2 + pi) = 1 + 2 * t * sigma(pi ^ 2).
那么对于T = [0, m - 1],求和即可,ans = sigma(1 + 2 * t * sigma(pi ^ 2)),ans = m + m * (m - 1) * sigma(pi ^ 2).
第二问:
对于一个人,我们考虑他的是否中奖情况,将其定义为ci,ci 若为1则中奖,否则没有。那么答案为E(sigma(ci)) = sigma(E(ci)).
E(ci) 为一个人中奖的概率,E(ci) = 1 - (1 - pi) ^ m.
1 #include <bits/stdc++.h> 2 #define rep(i, a, b) for (int i = a; i <= b; i++) 3 #define drep(i, a, b) for (int i = a; i >= b; i--) 4 #define REP(i, a, b) for (int i = a; i < b; i++) 5 #define mp make_pair 6 #define pb push_back 7 #define clr(x) memset(x, 0, sizeof(x)) 8 #define xx first 9 #define yy second 10 using namespace std; 11 typedef long long i64; 12 typedef pair<int, int> pii; 13 const int inf = ~0U >> 1; 14 const i64 INF = ~0ULL >> 1; 15 //******************************* 16 const int maxn = 100005; 17 int c[maxn]; 18 double Pow(double base, int num) { 19 double ret = 1; 20 while (num) { 21 if (num & 1) ret *= base; 22 base *= base; 23 num >>= 1; 24 } 25 return ret; 26 } 27 int main() { 28 int n, m; 29 scanf("%d%d", &n, &m); 30 i64 sum(0); 31 rep(i, 1, n) scanf("%d", &c[i]), sum += c[i]; 32 double ans1(0); 33 static double p[maxn]; 34 rep(i, 1, n) p[i] = 1.0 * c[i] / sum; 35 rep(i, 1, n) ans1 += p[i] * p[i]; 36 ans1 *= m; 37 ans1 *= m - 1; 38 ans1 += m; 39 printf("%.2lf\n", ans1); 40 double ans2 = n; 41 rep(i, 1, n) ans2 -= Pow(1.0 - 1.0 * p[i], m); 42 printf("%.2lf\n", ans2); 43 return 0; 44 }
时间: 2024-10-25 20:44:07