参考了 这篇
基本模型与技巧
前置知识只有两个, 一个是基本的计数技巧, 在这里略去不提, 另一个是:\sum\limits_{i=0}^n (-1)^i \dbinom{n}{i}=[n=0], 这个证明的话就看一下杨辉三角一行里上一行成分的构成(依据 \binom nm = \binom{n-1}{m}+\binom{n-1}{m-1}), 会发现不同列分奇偶加起来是一样的。
并集转交集
本蒻记忆中第一个接触的容斥就是它了, 著名的奇加偶减, 一般使用时设 S_i 表示满足条件 i 的集合。
|\bigcup_{i=1}^n S_i| = \sum_{i=1}^n (-1)^{i+1} \sum_{1\le a_1<\cdots<a_i\le n}|\bigcap_{j=1}^i S_{a_i}| \tag{1}
证明:对于一个元素, 假设其出现在 S_1,S_2\cdots,S_m, 其对右式的贡献为:
cnt = |\{S_i\}| - |\{S_i\cap S_j\mid 1\le i<j\le m \}| + \cdots
\\
= \sum_{i=1}^m (-1)^{i+1} \binom{m}{i}
\\
= \binom{m}{0}-\sum_{i=0}^m (-1)^i \binom{m}{i}
\\
= 1 -[m=0]
\\
=1
至于最后一步,是因为 m\ge 1。
这个著名的式子 (1) 还可以写成如下形式,更为简洁:
|\bigcup_{i=1}^n S_i| = \sum_{I\subseteq [n],I\neq \varnothing} (-1)^{|I|+1} |\bigcap_{i\in I}S_i|
交集转并集/取反的并集/取反的交集
依然是奇加偶减。
|\bigcap_{i=1}^n S_i| = \sum_{i=1}^n (-1)^{i+1}\sum_{1\le a_1<\cdots<a_i\le n}|\bigcup_{j=1}^i S_{a_i}| \tag{2}
证明依旧, 对于一个出现在所有集合里的元素, 其对右式的贡献为:
\sum_{i=1}^n (-1)^{i+1}\binom{n}{i}
\\
= 1-[n=0]
\\
=1
对于一个出现在 S_1,\cdots,S_m 里的元素(m<n),其对右式的贡献为:
\sum_{i=1}^n (-1)^{i+1}\binom{n}{i} - \sum_{i=1}^{m-n}(-1)^{i+1}\binom{m-n}{i}
\\
=1-1
\\
=0
也就是把这类元素先当作出现在所有集合里, 再减去那些本不应有的贡献。
同样地, 式子 (2) 可以写成:
|\bigcap_{i=1}^n S_i| = \sum_{I\subseteq [n],I\neq \varnothing} (-1)^{|I|+1} |\bigcup_{i\in I}S_i|
将交集转化成并集的另一个式子是:
|\bigcap_{i=1}^nS_i|=|U|-|\bigcup_{i=1}^n\overline{S_i}| \tag{3}
证明:组合意义,不是全满足的,就必定不满足至少一项。
这个通常结合式子 (1) 进行应用, 即:
|\bigcup_{i=1}^n\overline{S_i}| = \sum_{I\subseteq [n],I\neq \varnothing} (-1)^{|I|+1} |\bigcap_{i\in I}\overline{S_i}|
\\
|\bigcap_{i=1}^nS_i| = |U|+\sum_{I\subseteq [n],I\neq \varnothing} (-1)^{|I|} |\bigcap_{i\in I}\overline{S_i}|
若是认同 I = \varnothing 的时候后面那个交集的大小就是全集, 那么这个式子可以直接写成这样:
|\bigcap_{i=1}^nS_i| = \sum_{I\subseteq [n]} (-1)^{|I|} |\bigcap_{i\in I}\overline{S_i}| \tag{4}
基本例题
[COCI2009-2010#6] XOR
设第 i 个三角形为 S_i, 答案就是 |Xor_{i=1}^n S_i|。
我是没怎么想到容斥, 但是这个可以用容斥做,不过倒是可以大概地猜到用容斥做的话大概率转换成交集。
那么枚举交集:\sum\limits_{I\subseteq [n],I\neq \varnothing}nanachi* |\bigcap\limits_{i\in I} S_i| , 那么就要有一个系数 nanachi, 那么 nanachi 的性别是什么呢?
显然对于一个属于 x 个集合的元素的贡献是 [2\nmid x], 设 id(x) 为 x 个集合的容斥系数,那么由于使用的是交集, 所以这个元素的贡献实际上是:
\sum_{i=1}^x\binom xi id(i) = [2\nmid x]
若是令 id(0)=0,那么利用二项式反演可以得到:
\sum_{i=0}^x\binom xi id(i) = [2\nmid x]
\\
id(x)=\sum_{i=0}^x (-1)^{x-i}\binom xi [2\nmid i]=\sum_{i=0}^x (-1)^{x+i}\binom xi [2\nmid i]= (-1)^x\sum_{i=0}^x (-1)^{i}\binom xi [2\nmid i]
\\
= (-1)^{x+1}\sum_{i=0}^{x} (-1)^{i+1}\binom xi [2\nmid i]
\\
= (-1)^{x+1}2^{x-1}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡