題目大意: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另一種做法:概率dp5using
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一樣,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 5view code2using
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 }
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 ...