二项式反演
前言
这个东西学过一段时间,当时基本没理顺,现在感觉还行,就简单点讲讲。
可能需要对容斥有一点理解。
公式推导
来点看得懂的工业化程序。
假设我们已有两个定义在非负整数集上的函数 F(x),f(x)。
他们满足这样的关系
F(n)=k=0∑n(kn)f(k)
那么必然有
f(n)=k=0∑n(−1)n−k(kn)F(k)
注意清楚他们的逻辑关系,现在给出一个推导
k=0∑n(−1)n−k(kn)F(k)=k=0∑n(−1)n−k(kn)i=0∑k(ik)f(i)=k=0∑ni=0∑k(−1)n−k(kn)(ik)f(i)
这里借助一个组合恒等式帮助证明
(rn)(kr)=(kn)(r−kn−k)
并交换枚举顺序,那么就有
k=0∑ni=0∑k(−1)n−k(kn)(ik)f(i)=k=0∑ni=0∑k(−1)n−k(in)(k−in−i)f(i)=i=0∑n(in)f(i)k=i∑n(k−in−i)(−1)n−k
此时考虑将枚举 k 时下调 i,那么就有
i=0∑n(in)f(i)k=i∑n(k−in−i)(−1)n−k=i=0∑n(in)f(i)k=0∑n−i(kn−i)(−1)n−i−k
此时再用二项式定理化简
(a+b)n=i=0∑n(in)aibn−i
所以有
i=0∑n(in)f(i)k=0∑n−i(kn−i)(−1)n−i−k=i=0∑n(in)f(i)(1−1)n−i
故仅当 i=n 时 (1−1)0=1,故
F(n)=k=0∑n(kn)f(k)
证毕。
组合意义
然而我们在平时做题时很难得到能够直接使用二项式反演的公式,故我们考虑对于函数 F(x),f(x) 赋予一定的实际意义,从而使用到二项式反演。
通常,f(x) 表示我们钦定在已满足有关 x 级别时的方案数,而 F(x) 表示我们恰好满足有关 x 级别时的方案数。
现在举个例子方便我们说明和理解。
错位排列
恰好的我们也找到了一个在学习组合数学时也会遇到的一个问题。
此时我们考虑 f(x) 表示钦定有 x 个位置是正确排序的,那么 F(x) 则表示恰好有 x 个位置是正确排序的。同时 Di 表示排列大小为 i 的错排方案数。
那我们考虑枚举哪些数是正确排序,而其他数随意排序来表示 f(x)。
f(i)=(in)(n−i)!
同时我们可以通过 f(k) 的定义得到 F(i) 的表达式为
f(i)=j=i∑n(ij)F(j)
稍微感性一点理解,我们发现对于恰好有 j 个位置正确排序一定是在钦定了 i 个位置正确排序后会被枚举 (ij) 次。那么二项式反演后
F(j)=i=j∑n(−1)j−i(ji)f(i)
是否有一点奇怪?这同样也是二项式反演,只是表达的是另一种经典形式
f(n)=i=n∑m(ni)F(i)F(n)=i=n∑m(ni)(−1)i−nf(n)
以及
f(n)=i=0∑n(−1)i(in)F(i)F(n)=i=0∑n(−1)i(in)f(i)
以上三种都是二项式反演的三种经典形式,第二种则是最常用的形式。
应用
现在到了真正的错位排列环节。
考虑到所有的排列方案数为 n!,那么我们枚举其中 i 个是正确排列而其余均为错位排列,即
n!=i=0∑n(in)Dn−in!=i=0∑n(in)Di
套一个二项式反演即可得到
Dn=i=0∑n(in)(−1)n−ii!
于是得到了错排方案数的线性求解式。