心路:
題解,,,,其實就是,,,;這四個集合在隨機組成的方案中,空集相當於哪個集合都沒取交集為空所以不符合。
求出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#includeview codeusing
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()
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...