1. 程式人生 > >HDU - 4336 (容斥)

HDU - 4336 (容斥)

std 代碼 fin ans fine 是不是 amp 期望 itl

題意:給你n個獎,每個機會只能中一個獎,中獎的概率分別是{p1,p2,p3......pn};並且這些獎是兩兩沒有交集。(pi*pj=0)問,需要多少次才能把所有獎都中完的期望值。

先來分析:中所有獎事件A={{中獎A1},{中獎A2},{中獎A3}.....{中獎An}},是不是相當於A事件滿足了Ai的所有性質。(這就是容斥的基本定理。)

技術分享圖片

那怎麽計算期望?先分析一個,也就是例一,E(X)=∏(1-p)x-1p,這就是一個幾何概率的期望(想要證明的話,請查閱冪級數(1+x+x2....+xn=1/(1-x) )

好了,那麽後面的AiΛAj,其實就是相當於中兩個獎的概率(仔細體會)。

ac代碼:

#include<cstdio>
#define ll long long
double p[22];
int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; ++i)
            scanf("%lf", &p[i]);
        double ans = 0;
        for (ll i = 1; i < (1LL << n); ++i)
        {
            
int cnt = 0; double sum = 0; for (int j = 0; j < n; ++j) if (i&(1LL << j)) { ++cnt; sum += p[j]; } if (cnt & 1)ans += 1.0 / sum; else ans -= 1.0 / sum; } printf(
"%.5lf\n", ans); } }

HDU - 4336 (容斥)