链接
题目大意
一个有$n$个元素的集合有$2^n$个不同子集(包含空集),现在要在这$2^n$个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,对1e9+7取模
做法
直接求比较困难,我们考虑先求出$a_i$表示交集大小至少为i的方案数。
那么这i个数的取法是$\binom{n}{i}$,剩下的$n-i$个元素取或不取有$2^{n-i}$中选择,而这么多集合分别又有取或不取两种选择,所以$a_i=\binom{n}{i}*(2^{2^{n-i} }-1)$减1是因为至少取一个,把全部不取的情况减掉。
知道这个之后我们考虑构造容斥系数$f_i$,使得$ans=\sum\limits_{i=0}^{n}f_i*a_i$
那么怎么求这个$f$呢,我们考虑每种交集恰好为$x$的选法,对于每个$a_i$的贡献的总和。
由于选取的集合已经固定,所以对于每个$a[i]$的贡献就是$\binom{x}{i}$,总贡献为
$\sum\limits_{i=0}^{x}f_i\binom{x}{i}$
定义kronecker delta函数$g(x,k)$,即
$g(x)=[x=k]$
我们对于交集恰好为k的函数应该对最后答案有1的贡献。
所以$g(x)=\sum\limits_{i=0}^{x}f_i\binom{x}{i}$
那么我们可以二项式反演
二项式反演证明戳这里
$f_{n}=\sum\limits_{i=0}^{n}(-1)^{n-i}\binom{n}{i}g(i)$
由于只有$g(k)=1$,所以
$f_i=(-1)^{i-k}\binom{i}{k}*[i>=k]$
再将$f$带入到最上面求$ans$的式子里就行了。
$ans=\sum\limits_{i=k}^{n}(-1)^{i-k}\binom{i}{k}\binom{n}{i}*(2^{2^{n-i} }-1)$
代码实现的时候$(2^{2^{n-i} }-1)$不好处理,
我们可以$i$从倒序枚举,$2^{2^{n}}=(2^{2^{n-1} })^2$计算
代码
1 |
|