容斥、反演、卷积与高维前缀和

数学的大网磅礴地展开了。

容斥、反演、卷积与高维前缀和 Stream

Draft

我觉得,我们最开始使用的时候,肯定是从最普通基础的容斥原理讲起的,因为这就是我们实际遇到的一种问题:

问题 1 通过集合交求集合并

假设班里有 10 个学生喜欢数学,15 个学生喜欢语文,21 个学生喜欢编程,班里至少喜欢一门学科的有多少个学生呢?

我们小学的时候就学习过这种问题,当时,我们会画 Venn 图来解决:

容斥原理 - venn 图示例

我们将这个形式一般化,就变成了:

公式 1 容斥原理

|i=1nSi|=m=1n(1)m1ai<ai+1|i=1mSai|

这个形式很有意思,它为什么正确?

定理 1 二项式定理

(x+y)n=k=0n(nk)xnkyk

证明 容斥原理

一个元素一个元素考虑,我们需要算出最后的并集,所以每一个元素的贡献都应该是 1,我们假设元素 xS1,S2,,Sm 这些集合中,那么他的贡献次数就是:在一个集合中-在两个集合的交中+在三个集合的交中……

那么贡献就分别是:(m1),(m2),,(mm),总和就是

i=1m(1)i1(mi)=(m0)i=0m(1)i(mi)

这个好像就是二项式定理的形式!那么他的总和就是 1

所以证明它的关键想法是,我们要计算每个元素贡献,确保为 1

我们通过容斥原理,将求集合并转化为求集合交。这一切是通过附加一个系数实现的。

To do:从线性代数的角度说明。

但是,当问题比较复杂的时候,容斥原理可能就似了。

问题 2 错位排列计数

对于一个长为 n 的排列 p,称数 i 在初始位置当且仅当 pi=i,现在要求有多少序列满足恰好m 个元素在初始位置

这个问题不好直接计算,但是我们马上就指出,可以用钦定 k 个元素保持原位的方案数来计算原问题的答案。我们设原问题规模为 k 的实例的答案是 f(k),转化后问题的答案是 g(k)

那么,

g(k)=(nk)(nk)!

现在如何将它转化为 f(k) 呢?我们还是考虑一个方案的贡献要为 1

我们考虑一个恰好有 m 个元素在初始位置的方案,它在 g(m) 中会被计算一次。但是,g(m) 中还包含实际上有多于 m 个元素在初始位置的方案,那么我们尝试减去 g(m+1)。我们现在看看我们是否使得重复的元素都恰好被减去一次,对于一个有 m+1 个元素在初始位置的方案,我们发现在 g(m) 中,有 (m+1m) 种钦定方案都计算了它,所以它被计算了不止一次,在 g(m+1) 时它只被减去一次,减少了,应该减去 (m+1m) 次。

好的,我们减去 (m+1m)g(m+1),然后我们不妨再考虑下有 m+2 个元素在初始位置的方案,它在 g(m) 中计算了 (m+2m) 次,在 g(m+1) 中计算了 (m+2m+1) 次,被减掉了 (m+2m+1)(m+1m)=(m+2)2 次,又减多了。以此类推,在 g(m+2) 中被算一次,此时再补上 (m+2m) 就正好对答案不造成贡献了。

我们写出来发现的规律:

f(m)=k=mn(1)km(km)g(k)

上面的推导过程其实蕴含着下面这条性质:

g(m)=k=mn(km)f(k)

好的,我们实际上得到了这样的等价关系:

公式 2 二项式反演-形式二

f(n)=i=nm(in)g(i)g(n)=i=nm(1)in(in)f(i)

当当,这就是著名的二项式反演最常用的形式!(证明请见 OI-Wiki

二项式反演可以转化“钦定”/“恰好”类型的问题。他们都满足形如左边这样的关系,我们可以将它换成右边这样!

所以反演其实是“凑容斥系数”的一些特殊情况,在这些问题上我们无需依靠直觉,只需要套就行了。

posted @   haozexu  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2023-02-28 DP-笔记1
点击右上角即可分享
微信分享提示