HDU 5159 要求計算從 1..x 中每個數被選中的期望總和:每輪從 x 個數中等概率選一個,共 b 輪,求最終選中數字之和的期望。本文應用期望線性性質拆解為單個數字期望之和,利用快速冪計算概率。
I_i = 數字 i 是否至少被選中一次(0/1)。E[∑ i * I_i] = ∑ i * E[I_i] = ∑ i * P(i 被選中至少一次)。每輪選中 i 的概率 = 1/x。
b 輪全不選中 i 的概率 = (1 - 1/x)^b。
至少選中一次 = 1 - (1 - 1/x)^b。
期望貢獻 = i * (1 - (1 - 1/x)^b)。
總期望 = ∑_{i=1}^x i * (1 - (1 - 1/x)^b) = (1 - (1 - 1/x)^b) * x(x+1)/2。
但題目可能要求輸出每個 Case 的期望值,直接按公式計算即可。
b 可達 10⁹,需 O(log b) 快速冪。
double pow_fast(double base, int exp) {
double res = 1.0;
while (exp) {
if (exp & 1) res *= base;
base *= base;
exp >>= 1;
}
return res;
}
#include <cstdio>
#include <cmath>
using namespace std;
double fastPow(double a, int n) {
double r = 1;
while (n) {
if (n & 1) r *= a;
a *= a;
n >>= 1;
}
return r;
}
int main() {
int T, x, b;
scanf("%d", &T);
for (int tc = 1; tc <= T; ++tc) {
scanf("%d%d", &x, &b);
double p_not = fastPow(1.0 - 1.0/x, b);
double p_yes = 1.0 - p_not;
double sum = p_yes * x * (x + 1) / 2.0;
printf("Case #%d: %.3lf\n", tc, sum);
}
return 0;
}
直接計算所有可能結果的加權平均:
x^b 種等概率結果。x^b。S(b, k) 計算「b 次選擇恰好覆蓋 k 個不同數」的方案數。E[X+Y] = E[X] + E[Y] 無需獨立性。將「總和期望」拆解為「每個數字貢獻期望之和」。本題是「期望線性性質 + 快速冪」的教科書級應用。核心步驟:
此思路廣泛適用於「多次獨立隨機試驗,求某類事件發生期望」問題。