組合數學 容斥 集合計數

2022-03-26 20:36:10 字數 1264 閱讀 9164

首先我們知考慮只有一種交集

交集的大小為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)種方法

這裡面包含了交集大小大於k的取法,所以還要進行容斥

對於交集大小為l,有tmp(l)=cl

n *(2^(2^(n-l)-1)種取法

但是tmp(k)多的不止一倍的tmp(l),因為對於每一種交集都多加了tmp(l)

多出ckl倍

例如:集合為,k=2

tmp(k)包含了交集大小為k,k+1,k+2...n的取法種數

合法的交集是ab,ac,ad...

但是出現了像bcde這樣不合法的交集

只計算交集為bc時多餘bcde交集,算bd,be...同樣多出

所以bcde被多算了c2

4次容斥的話,l-n是奇數就減去ck

l  *tmp(l),l-n是偶數就加上ck

l  *tmp(l

)

1 #include2 #include3 #include4

using

namespace

std;

5const

long

long p=(int)1e9+7;6

const

int maxn=(int)1e6+100;7

intn,k;

8long

long

fac[maxn],faci[maxn];

9long

long qp[maxn]; //

2^2^i

10long

long ans=0;11

long

long qpow(long

long a,long

long b,long

long

p)22

return

out;23}

2425

long

long c(int n,int

m)30

31long

long t(int i)

3435

intmain()

53 printf("

%lld\n

",ans);

54 }

view code

Bzoj2839 集合計數 組合數學 容斥

答案是含有至少k個的 至少k 1個的 至少k 2個的 從n個數中選出k個作為交集中的數,是c n,k 這樣的集合共有2 2 n k 1個 2 n k 是包含選定的k個數的可選集合的數量,選取方案有2 2 n k 1個 不能有空集否則無法保證k個元素 所以ans c n,k c k,k 2 2 n k...

集合計數 (容斥原理)

心路 題解,其實就是,這四個集合在隨機組成的方案中,空集相當於哪個集合都沒取交集為空所以不符合。求出1,3後乘上c n,2 不就是交出來至少含k個的方案數了嗎?顯然不是,有重複的啊 比如1,3會求到交,而1,4.3,4也會 當時我就這崩了.看重複的有多少啊 對於求k個時交出來是k 1個的會算c k ...

BZOJ2839 集合計數 容斥原理 組合數

乙個有n個元素的集合有2n個不同子集 包含空集 現在要在這2n個集合中取出若干集合 至少乙個 使得 它們的交集的元素個數為k,求取法的方案數,答案模1000000007。是質數喔 一行兩個整數n,k 一行為答案。3 2 樣例說明 假設原集合為 則滿足條件的方案為 資料說明 對於100 的資料,1 n...