奇怪的基础容斥数学课件
子集反演
一般有一个很套路的方法。
比如现在有一个全集条件集合 U,现在要求恰好 S 集合满足,U−S 集合不满足的方案数,设其为 fS,然而这个并不能直接算出。有一个比较好算的东西是,钦定 T 集合满足,不管 U−T 集合是否满足的方案数,设其为 gT。
显然有 gS=∑S⊆TfT,然后我们可以根据子集反演得到 fS=∑S⊆TgT(−1)|T|−|S|,这样的话就可以算出要求的方案数了。
这个玩意正确的原因是这样的:可以直接把前一个式子代入后一个式子,会得到
fS=∑S⊆T∑T⊆ZfZ(−1)|T|−|S|
=∑S⊆ZfZ∑S⊆T,T⊆Z(−1)|T|−|S|
=∑S⊆ZfZ∑T⊆Z−S(−1)|T|
=∑S⊆ZfZ[S=Z]=fS
小星星#
这题中的限制实际上就是:
- n 个点均出现在用来编号的排列中。
- 相邻的编号存在边。
所以考虑这样一个做法,首先将排列这个限制去掉,转化为任意编号。
钦定集合 S 可以出现在编号序列中,然后做一个简单的树形 dp 来统计这样的方案数 gS。
套用上面的式子,现在求的就是 fU ,有 ans=∑SgS(−1)|U|−|S|。
Ribbons on Tree#
要求每条边都能被至少一条路径覆盖。
其实只需要钦定若干条边没有被覆盖,这样就会形成若干个联通块。
对于一个节点数为 n 的联通块,不需要保证联通块内的边都被覆盖,所以任意匹配的方案数就是 [2|n](n−1)!!。
答案就是对所有钦定的边集对应的方案数乘上容斥系数求和,这个东西只要记一下这个联通块已经放了多少个点,写一个 O(n2) 的树形 dp 就可以解决,解题的思想就是用 dp 来优化子集反演中暴力枚举条件集合的过程。
二项式反演
这个东西就与子集反演比较类似了,一般应用于现在的条件集合与具体哪些没有关系,而只与集合大小有关。
同样钦定若干个条件满足,设为 gi,将恰好的方案数设为 fi,有 g_i=\sum \limits_{i \leq k}f_k\binom{k}{i}。
然后根据二项式反演可以得到 f_i=\sum \limits_{i \leq k}g_k\binom{k}{i}(-1)^{k-i}。
同样用代入的方法证明,将前一个式子代入后一个。
f_i=\sum \limits_{i \leq k}\sum \limits_{k \leq j}f_j\binom{j}{k}\binom{k}{i}(-1)^{k-i}
=\sum \limits_{i \leq j}f_j \sum \limits_{i \leq k \leq j}\binom{j}{k}\binom{k}{i}(-1)^{k-i}
=\sum \limits_{i \leq j}f_j \sum \limits_{i \leq k \leq j}\binom{j}{i}\binom{j-i}{k-i}(-1)^{k-i}
=\sum \limits_{i \leq j}f_j \binom{j}{i} \sum \limits_{k=0}^{j-i}\binom{j-i}{k}(-1)^k
=\sum \limits_{i \leq j}f_j \binom{j}{i} (1-1)^{j-i}=f_i
集合计数#
一个有 n 个元素的集合有 2^n 个不同子集(包含空集)。
现在要在这 2^n 个集合中取出至少一个集合,使得它们的交集的元素个数为 k ,求取法的方案数。
1 \leq n \leq 10^6 ,0 \leq k \leq n。
要求的是交集大小恰好为 k ,设为 f_k,有一个容易算出的东西是钦定交集大小至少为 k,设为 g_k,有 g_k=\binom{n}{k} (2^{2^{n-k}}-1)。
g_k=\sum \limits_{i \geq k} \binom{i}{k}f_i
所以可以套用二项式反演的式子得到 f_k=\sum \limits_{i \geq k}\binom{i}{k}(-1)^{i-k}g_i
七选五#
设 f_i 表示至少 i 个元素放在对应位置的方案数,g_i 表示恰好 i 个元素放在对应位置的方案数,有 f_i = \sum \limits_{j=i}^n g_j \binom{j}{i}, f_i = \binom{k}{i} \binom{n-i}{k-i}(k-i)!。
反演一下就有 g_i = \sum \limits_{j=i}^n f_j \binom{j}{i}(-1)^{j-i},这个就是答案了,这道题的 n=k,x=0 算是经典的错排问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构