hdoj4336(容斥原理or概率DP)

2022-08-02 11:30:19 字數 1500 閱讀 7975

題目大意:n種卡牌,每種卡牌被抽到的概率依次為p1,p2,,,pn,抽一次最多抽到一張,最少0張。問抽滿n種卡的次數的期望。

用容斥原理來做,先單獨考慮,再減去重複的。比如有兩種卡牌a,b,分別為p1,p2,抽到a牌的期望為1/p1,抽到b牌的期望為1/p2,然而抽a牌時會有對b牌的重複,抽b牌亦然。根據容斥原理,減去兩者的並部分(這個並部分似乎在這裡有些難以理解,對於概率論沒學好的我。。。),這個並部分即抽到a或b的期望。即e=e1+e2-e(12)=1/p1 + 1/p2 - 1/(p1+p2)。

卡牌多了,奇加偶減。

ac**:

1 #include2 #include3 #include4

5using

namespace

std; 67

double a[30];8

9double solve(int

x)10 23}

24if(flag&1) sum+=1/sum2;

25else sum-=1/sum2;26}

27return

sum;28}

29int

main()

30 37

3839

40return0;

41 }

另一種做法:概率dp

像狀壓dp一樣,1表示已經取到了這種卡,0表示還沒。

先看個例子,假設有10種卡,每種卡片被抽到的概率均為0.1,dp分析,假如我們已經抽到了k種卡片,那麼再抽到一種新的卡片(第k+1種)的概率即為(10-k)/10,再抽到這種卡片的期望次數即為10/(10-k)。

所以,dp[k+1] = dp[k] +  10/(10-k);

當然,本題概率並不均等,還可能抽一次,毛都沒有。

上面的式子也是化簡後的式子,因為還需考慮是哪k種卡片,第k+1種又是哪一種。

期望一般逆推:

dp[k]=sum+p(n-k)

設dp[(1<

**:

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6const

int maxn = 20;7

double dp[1

<

8int

main()919

20int last = (1

<< n)-1

;21 dp[last]=0

; 22

for(int i = last-1; i >= 0; i--)

2331 dp[i] = k/(1-temp)+1.0/(1-temp);

3233

}34 printf("

%.5f\n

", dp[0

]);35}36

return0;

37 }

view code2

hdu 4336 容斥原理

按照解題報告的提示,用容斥原理實現 for int j bg 1 j另解 概率dp,康哥指導的 include include includeusing namespace std double f 1 21 gl 22 int main int i,j,k,n double fz,fm while...

hdoj 4315 容斥原理)

問題描述 給定數字n,要求您計算a和b之間的整數 與n相對質數 相對於n而言,如果 兩個整數除1以外沒有共同的正除數,則稱這兩個整數為互質或相對質數。同樣,如果它們的最大公約數為1,則數字1對每個整數都是質數。輸入值 輸入的第一行包含t 0輸出量 對於每個測試用例,請列印a到b之間 包括n在內 的整...

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...