CF698C LRU 容斥原理 概率

2021-09-07 10:19:31 字數 1051 閱讀 6120

題意:n種物品,大小為k的佇列,\(p_i\)的概率選擇第i種物品放入隊尾,如果已經有i了就不放了。佇列大小》k時彈出隊首。求\(10^\)次操作後每種物品在佇列裡的概率

為什麼沒有官方題解啊,所以看了討論區的題解

一開始想的是,乙個元素在佇列裡,說明後來加入的元素種類\(|s| =0…k-1 : i \notin s\)的集合出現在i右面的概率就行了。但這時候要求的是\(s\)中每種物品至少出現1次,至多無限次,只是簡單的乘上\(\prod\limits_p_i\) 再乘上 \(\frac\)是不對的。

所以考慮容斥原理,求出\(s\)的任意子集出現的概率。

求這個概率很簡單,每種元素可以不出現,設\(x=\sum\limits_p_i\),那麼

\(p=x+x^2+...+x^=\frac\)

根據容斥原理,\(i\)的答案就是

\[ \le k-1種元素的集合出現的概率\ -\ \le k-2種元素的集合出現的概率*容斥係數\ +\ ... \]

和之前的恰好k個問題一樣,這個容斥係數需要乘上超集的個數,比如大小為\(i\)的集合,他的大小為\(j\)的超集的個數是\(\binom\),注意是\(n-1\)因為當前計算答案的元素不能選

需要注意的是,我們要同時求恰好\(0...k-1\)個,所以每個的容斥係數都要+1,並且要處理之前所有大小的超集

#include #include #include #include #include using namespace std;

typedef long long ll;

const int n=21, m=(1<<20)+5;

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int n, k, c[n][n];

double p[n], sum[m], coe[n], g[m];

inline int one(int x)

int main()

for(int i=0; i

HDU 2461 Rectangles(容斥原理)

題意 給出n個矩形的左下角和右上角座標,要求進行m次操作,每次對t個矩形進行塗色 給出這t個矩形的序號 要求計算出每次塗色時需要塗色的面積。塗色可以覆蓋,即每次操作不受前面任何操作的影響 分析 矩形之間可以覆蓋,每次操作要計算覆蓋後圖形的面積,這裡就要用到容斥原理 每次操作時有如下關係式 需要塗色的...

poj 3695 Rectangles 容斥原理

在容斥原理題單裡看到這個題,第一想法肯定是掃瞄線啊。但一看題單分析,還真是容斥。矩形相交的圖形和文氏圖差不多。然後dfs容斥就好了 題單裡第四題 include include include using namespace std struct rec rec rec 30 int nums 30...

CF383E Vowels 子集DP 容斥

戳這裡 首先很容易想到列舉母音字符集然後統計答案,至於統計答案可以採用容斥的方式得到,但是列舉母音字符集的子集複雜度是 o 3 的複雜度不對,我們發現這樣列舉的情況下許多狀態其實是無用的,壓根不會出現的,所以我們考慮列舉每乙個單詞的子集來容斥,得到母音恰好為 x 的時候有多少個單詞恰好包含這個字符集...