首先我們知考慮只有一種交集
交集的大小為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 #include4view codeusing
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 }
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...