LGP10596 集合计数 学习笔记
LGP10596 集合计数 学习笔记
题意简述
对于集合 \(\{1,2,\dots,n\}\) 的子集组成的集合中,有多少个满足其中每一个元素的交集大小恰为 \(k\)?答案对 \(10^9+7\) 取模。
\(k\le n\le 10^6\)。
做法解析
二项式反演初步
在讲这题之前,先较为详细地讲解一下二项式反演。
反演是什么?可以这么理解:对于两个数列 \(f(x),g(x)\) 而言,若它们之间存在某种对应关系,使得不仅能从 \(f(x)\) 推出 \(g(x)\),还能从 \(g(x)\) 反推出 \(f(x)\),那么这个过程就叫做反演。
形式化地,称 \(f(n)\) 为原数列,\(g(n)\) 为新数列,并满足 \(f(n)=\sum_{i=0}^{n}a_{n,i}\times g(i)\),那么反演就是我们通过 \(g(n)\) 求 \(f(n)\),即计算 \(g(n)=\sum_{i=0}^{n}b_{n,i}\times f(i)\)。
二项式反演的一个基础形式是:若 \(g(n)=\sum_{i=m}^n\binom{n}{i}f(i)\),则 \(f(n)=\sum_{i=m}^{n}(-1)^{n-i}\binom{n}{i}g(i)\)。这个式子在代数意义上的正确性是无需多言的。
证明上式的步骤:先把 \(g(i)\) 用 \(f(j)\) 表示。把 \(\binom{n}{i}\binom{i}{j}\) 改写成 \(\binom{n}{j}\binom{n-j}{n-i}\)。再交换一波求和符号后,你发现最后那个 \(\sum_{i=j}^n(-1)^{n-i}\binom{n-j}{n-i}\) 实际上等于 \([n=j]\)(二项式定理推论)。这样就证明完了。
这个东西是干什么用的呢?意义在于我们可以给它赋予对应的组合意义。
注:实际上,能用 \(f(n)\) 和 \(g(n)\) 表示的东西都仅以 \(n\) 为自变量。这说明你计数的东西差不多是需要满足元素之间互相等价的。
-
记 \(f(n)\) 为大小为 \(n\) 的方案中 \(n\) 个元素恰全部满足某个条件的方案数,\(g(n)\) 是 \(n\) 个元素中至少有 \(m\) 个元素满足某条件的方案数。则显然有:\(g(n)=\sum_{i=m}^n\binom{n}{i}f(i)\)。
-
类似地,还有:\(g(k)=\sum_{i=k}^n\binom{i}{k}f(i)\Leftrightarrow f(k)=\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}g(i)\)。这里 \(f(k)\) 可表示大小为 \(k\) 的方案中恰好 \(k\) 个元素满足某条件的方案数,而 \(g(k)\) 可表示“大小若干的方案中至少 \(k\) 个元素满足某条件”(其中钦定与否视作不同方案)的方案数。
那么你在知道 \(g(n)\) 的时候就可以用反演把 \(f(n)\) 淦出来了。
就这题而言
这个题的条件看起来就可以用二项式反演干掉。你设 \(f(k)\) 为交集恰好为 \(k\) 的方案数,\(g(k)\) 为钦定交集至少为 \(k\),其它随意(计数区分钦定与否)的方案数。那么显然满足:\(g(k)=\sum_{i=k}^n\binom{i}{k}f(i)\)。
\(g(k)\) 也是好求的,先钦定某 \(k\) 个(系数 \(\binom{n}{m}\))元素满足条件,剩下 \(n-m\) 个元素可以(在都包含钦定元素的基础上)形成 \(2^{n-m}\) 个集合,你的选法抛掉“一个都不选”就是 \(2^{2^{n-m}}-1\)。
事已至此,你反演罢。
对唐诗问题的解答
为什么答案不是 \(g(k)-g(k+1)\)?“至少为 \(k+1\)”减去“至少为 \(k\)”那不就是“恰好为 \(k\)”吗?
我们来代数推导一波这东西等于什么。
显然后面那坨东西不必然是 \(0\) 吧。
但组合意义上呢?
实际上你从上式的最终结果就能看出来端倪。\(\binom{i}{k}\) 代表着我们从 \(i\) 个里面钦定 \(k\) 个,后者亦然。我们的 \(g(i)\) 是区分元素钦定与否的。钦定元素的数量都不一样,怎么可能完全消掉呢?
所以另一方面来说,“钦定”也不能简单和“至少”划等号。
代码实现
象征性给几行。
mint G(int x){return Comb(N,x)*(fpow(2,fpow(2,N-x,M107-1),M107)-1);}
//int main()
for(int i=K;i<=N;i++)ans+=G(i)*Comb(i,K)*((i-K)&1?-1:1);
浙公网安备 33010602011771号