首先我来说说什么是反演(inversion),对于一个数列{fn}来说,如果我们知道另外一个数列{gn},满足如下条件 gn=i=0nanifi 反演过程就是利用 g0,g1,,gn 来表示出 fn fn=i=0nbnigi 本质上来说,反演其实是一个解线性方程组的过程,但是你观察后发现,这个矩阵实际上是一个三角矩阵,那必然存在着快捷的方法。对于使得这两个反演公式成立的这些系数应该满足什么条件呢?我们现在就来探讨一番! 我们首先讨论一下在什么情况下能够比较容易建立反演公式,之后介绍二项式反演以及它的两个应用,其中一个是错位排列问题

反演原理

首先我来介绍一个 δij 函数,这个函数被称为 Kronecker’s delta。它在 i=j 时为 1,在 ij 时为 0。 这个函数的定义非常简单,我介绍它完全是为了后面叙述的方便。

我们现在来考虑一下上面的式子,假设对于任意 0nN 都满足 gn=i=0nanifi 那么我们来考虑一下下面这个式子成立应该要满足什么条件 i=0nbnigi=fn 我们可以直接将 gi 代入上式来计算左边的求和 i=0nbnigi=i=0nbnij=0iaijfj=i=0nfij=inbnjaji 对于最后一步,实际上是变换了求和顺序,为了更容易理解,我按照矩阵的形式写出来 [bn0a00f0bn1a10f0bn1a11f1bn2a20f0bn2a21f1bn2a22f2bnnan0f0bnnan1f1bnnannfn] 那么,前一个求和是先对行进行,再将各行加起来,后一个就是先对列进行,再将各列加起来

这样的话,等式 ??? 成立的充要条件就是 j=inbnjaji=δni 同样地,我们反过来也能知道,整个反演公式要成立还需要满足一个必要条件 j=inanjbji=δni 也就是,如果你发现某个数列满足上面这个条件,那么你就可以直接建立起反演公式! 事实上,在快速傅立叶变换和逆变换你也可以认为是一个反演的过程,具体可以看这一步的推导,你会发现它和这个很相似。此外,第一类 Stirling 数和第二类 Stirling 数也满足这个条件,不过我暂时没有发现它们建立起的反演公式有什么应用。我下面来介绍一个比较有用的反演公式

二项式反演

下面就来介绍二项式反演(binomial inversion),这可以表示成 fn=i=0n(1)i(ni)gign=i=0n(1)i(ni)fi 你会发现这个式子具有极强的对称性!另外一个更加常见的形式是 fn=i=0n(ni)gign=i=0n(1)ni(ni)fi 现在我们先来给出这个公式的一个容斥解释,之后从代数角度证明一下这个式子,最后介绍两个它的应用

反演?这里就是容斥

实际上,二项式反演是容斥原理(inclusion-exclusion principle)的一种最常见的特例子,让我们先来回忆一下容斥原理:设集合 S 中具有性质 P1,P2,,Pn 的对象的集合为 A1,A2,,An,那么不具有这些性质的对象的集合大小为 |A1A2An|=|S||Ai|+|AiAj|++(1)n|A1A2An| 那么,考虑这样一种特殊的情况,若对于集族 U={A1,A2,,An} 中任意 i 个集合的并集的大小都是 gi,我们不妨设 gi=|A1A2An| 明显的,在 U 中一共有 (ni) 个这样的不同交集。另外,我们定义 g0=|S| 这样一来,上面的容斥结果就是 |A1A2An|=g0(n1)g1+(n2)g2++(1)n(nn)gn 由于 U 中任意 i 个集合的交集大小都是 gi,上面的公式左边的项也只和集合个数有关,我们可以设 fi=|A1A2Ai| 同样令 f0=|S|,那么同样使用容斥原理 |A1A2An|=|S||Ai|+|AiAj|++(1)n|A1A2An|=f0(n1)f1+(n2)f2++(1)n(nn)fn 这也正是 gn 的表达式,因此,整个证明就完成了!

代数证明

根据文章开头反演原理部分的讨论,加上这个公式的对称性,我们只需要证明 i=jn(1)i+j(ni)(ij)=δ(i,j) 这里 ani=(1)i(ni),bij=(1)j(ij) 好,现在我们来证明它,首先需要一个二项式系数的知识 (ni)(ij)=n!i!i!(ni)!j!(ij)!=n!j!(nj)!(nj)!(ni)![(nj)(ni)]!=(nj)(njni) 如果运用组合推理就相当于:你有一个 n 元素集 U,现在对 (A,B) 进行计数,其中 BAU|A|=i,|B|=j,首先对 A 计数,Ui 子集有 (ni),然后对 B 计数,Aj 子集有 (ij) 接下来换一种方式,先对 B 进行计数,B 显然是 U 的子集,有 (nj) 种方案,由于要求 BABj 个元素必须在 A 中,A 还剩下 ij 个不确定的元素,U 还有 nj 个可以用的元素,一共有 (njij) 种,于是就得到上面的恒等式,那么可以得到 这样最后就可以得到 i=jn(1)i+j(ni)(ij)=(nj)(1)ji=jn(1)i(njni)=(nj)(1)ji=0nj(1)ni(nji)=(nj)(1)n+j(11)nj=δnj 于是,反演公式就建立了!

应用

错位排列问题

求有多少个长度为 n 的排列 a1,a2,,an,满足对于所有的 1in,使得 iai 这个问题有很多解法,我们来介绍一个有意思的解法: 为了叙述方便,我们称位置 i不变的当且仅当 ai=i 首先我们知道,如果不考虑 iai 这个条件,问题是很简单的,长度为 n 的排列一共有 n! 种。并且这些排列是由恰好k(k=0,1,2,,n) 个位置是不变的排列组成,也就是,如果我们设 fi恰好i 个位置是不变的排列的个数,那么可以得到 n!=i=0n(ni)fi 是否觉得和刚刚的反演公式很相似?这里的 gi 就是 i!,那么,使用二项式反演可以得到 fn=i=0n(1)n+i(ni)i!=i=0n(1)n+in!(ni)!=n!i=0n(1)ii! 这也就是我们熟悉的错位排列

Update:有点看不懂当时这里写的是什么东西了。这里 fi 似乎应该理解成长度为 i 的排列中错位排列的方案数。对于长度为 n 的序列,可以按照有多少个不变的位置分解成 n+1 组,如果有 j 个不变的位置,那么剩下 nj 个位置就是一个错位排列,所以这样一组一共有 (nj)fnj 个不同的方案。

球染色问题

n 个球排成一行,你有 k 种颜色,要求给每一个球染色,相邻两个球颜色不可以相同,并且每种颜色至少使用一次 这是经常在高中数学组合那个部分见到的一个问题,只不过高中题目中数都很小 还是和刚刚的想法一样,如果没有每种颜色至少一次这个条件,那么问题很简单,答案是 k(k1)n1。这些方案是由恰好使用了 i(i=0,1,2,,k) 种颜色的方案组成的,那么设 fi恰好使用了 i 种颜色的方案数,可以得到 k(k1)n1=i=0k(ki)fi 经过反演得到 fk=i=2k(1)k+i(ki)i(i1)n1

结语

其实不仅仅是二项式反演,很多问题中最经常用到的方法就是把条件放宽,求出一个好计算的问题,之后加上这个条件得到方程,利用反演公式算出答案,思想很类似的一题是 BZOJ-3456. 城市规划