BZOJ4036 [HAOI2015]按位或 【minmax容斥 + 期望 + FWT】
阿新 • • 發佈:2018-07-04
align int 運算 () pre http string inline 幾何
是一個離散變量的幾何分布
設\(P(x = a) = p\)
那麽取到\(a\)的期望為
\[ \begin{aligned} E(x = a) &= \sum\limits_{k = 1}^{\infty}k(1 - p)^{k - 1}p \&= p\sum\limits_{k = 1}^{infty}k(1 - p)^{k - 1} \end{aligned} \]
記\(f(x) = 1 + 2x + 3x^2 + 4x^3 + \dots\)
則\(xf(x) = x + 2x^2 + 3x^3 + 4x^4 + \dots\)
則\((1 - x)f(x) = 1 + x + x^2 + x^3 + \dots\)
對於\(0 < x < 1\),\((1 - x)f(x)\)是收斂的,可以取到
\[(1 - x)f(x) = \frac{1}{1 - x}\]
\[f(x) = \frac{1}{(1 - x)^2}\]
所以
\[ \begin{aligned} E(x = a) &= p\frac{1}{p^2} \&= \frac{1}{p} \end{aligned} \]
題目鏈接
BZOJ4036
題解
好套路的題啊,,,
我們要求的,實際上是一個集合\(n\)個\(1\)中最晚出現的\(1\)的期望時間
顯然\(minmax\)容斥
\[E(max\{S\}) = \sum\limits_{T \subseteq S} (-1)^{|T| + 1}E(min\{T\})\]
那麽問題就轉化為了求每個集合中最早出現的\(1\)的期望時間
假如在\(k\)時刻出現,那麽前\(k - 1\)時刻一定都是取的補集的子集,記\(T\)補集的所有子集概率和為\(P\)
\[E(min\{T\}) = \sum\limits_{k = 1}^{\infty}kP(1 - P)^{k - 1}\]
是一個離散變量的幾何分布
設\(P(x = a) = p\)
那麽取到\(a\)的期望為
\[ \begin{aligned} E(x = a) &= \sum\limits_{k = 1}^{\infty}k(1 - p)^{k - 1}p \&= p\sum\limits_{k = 1}^{infty}k(1 - p)^{k - 1} \end{aligned} \]
記\(f(x) = 1 + 2x + 3x^2 + 4x^3 + \dots\)
則\(xf(x) = x + 2x^2 + 3x^3 + 4x^4 + \dots\)
則\((1 - x)f(x) = 1 + x + x^2 + x^3 + \dots\)
對於\(0 < x < 1\),\((1 - x)f(x)\)是收斂的,可以取到
\[(1 - x)f(x) = \frac{1}{1 - x}\]
\[f(x) = \frac{1}{(1 - x)^2}\]
所以
\[ \begin{aligned} E(x = a) &= p\frac{1}{p^2} \&= \frac{1}{p} \end{aligned} \]
非常棒,我們只需要求出所有集合的子集概率和就好了
其實就是或運算的\(FWT\)
然後就切掉辣
復雜度\(O(n2^n)\)
代碼非常短
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn = (1 << 20); int n,N,cnt[maxn]; double p[maxn],ans; int main(){ scanf("%d",&n); N = (1 << n); for (int i = 0; i < N; i++) scanf("%lf",&p[i]); for (int i = 1; i < N; i <<= 1) for (int j = 0; j < N; j += (i << 1)) for (int k = 0; k < i; k++) p[j + k + i] += p[j + k]; for (int i = 1; i < N; i++) cnt[i] = cnt[i >> 1] + (i & 1); for (int i = 1; i < N; i++){ if (1.0 - p[(N - 1) ^ i] < 1e-9){puts("INF"); return 0;} ans += ((cnt[i] & 1) ? 1.0 : -1.0) * (1.0 / (1 - p[(N - 1) ^ i])); } printf("%.9lf\n",ans); return 0; }
BZOJ4036 [HAOI2015]按位或 【minmax容斥 + 期望 + FWT】