集合計數 (容斥原理)

2022-05-06 20:42:11 字數 1206 閱讀 9130

心路:

題解,,,,其實就是,,,;這四個集合在隨機組成的方案中,空集相當於哪個集合都沒取交集為空所以不符合。

求出1,3後乘上c(n,2)不就是交出來至少含k個的方案數了嗎?顯然不是,,,有重複的啊

比如1,3會求到交,而1,4..3,4也會(當時我就這崩了...)

看重複的有多少啊->對於求k個時交出來是k+1個的會算c(k+1,k)遍以此類推..所以在容斥時只要把重複的倍數減去就行。

設f(k)=c(n,k)*(  2^( 2^(n-k) )-1 ),

答案就是f(k)*c(k,k)-c(k+1,k)*f(k+1)+c(k+2,k)*f(k+2)...;

預處理階乘和逆元,2^...這裡也要預處理不然會wa(我也不知道為哈用快速冪求出的大資料就是不對)。

2^(2^(n-k))=( 2^(2^(n-k-1)) )^2,利用這個性質倒推預處理出來就行了f(

k)∗c

kk−f

(k+1

)∗ck

+1k+

f(k+

2)∗c

k+2k

...f

(n)∗

cnk'>f(k

)∗ck

k−f(

k+1)

∗ck+

1k+f

(k+2

)∗ck

+2k.

..f(

n)∗c

nk'>

f(k)∗ckk−f(k+1)∗ckk+1+f(k+2)∗ckk+2...f(n)∗ckn

}

#include#include

using

namespace

std;

#define ll long long

const

int mod=1e9+7

;const

int maxn=1000010

;int

n,k;

ll ans,f[maxn];

ll fac[maxn],inv[maxn],qtwo[maxn];

ll qpow(ll a,

intb)

return

ans;

}void

init()

void f(int

x)void

rongchi()

intmain()

view code

bzoj 2839 集合計數 容斥原理

因為要在n個裡面選k個,所以我們先列舉選的是哪 k 個,方案數為 c k 確定選哪k個之後就需要算出集合交集正為好這 k 個的方案數,考慮用容斥原理。我們還剩下 n k 個元素,交集至少為 k 的方案數為 2 相當於在僅有剩下 n k 個元素的集合裡隨便選,最後再往每個集合裡塞進這 k 個元素。然後...

組合數學 容斥 集合計數

首先我們知考慮只有一種交集 交集的大小為k,那麼有2n k個子集包含了這k個元素 確定k個元素,再從剩下n k個元素任意選取,有2n k種組合 用這2n k個子集能有2 2 n k 種組合,再減去1個空集 一共有ck n種交集,這樣得出tmp k ck n 2 2 n k 1 種方法 這裡面包含了交...

BZOJ 2839 集合計數 容斥原理 組合

題意 n個元素的集合,選出若干子集使得交集大小為k,求方案數 先選出k個 binom 剩下選出一些集合交集為空集 考慮容斥 交集為 emptyset 任意選的方案數 交集 ge 1 的方案數 交集 ge 2的方案數 交集 ge i 就是說先選出i個元素在交集裡,剩下的元素的集合任選 那麼就是 sum...