二项式反演、斯特林反演、莫比乌斯反演、第一类斯特林数、第二类斯特林数。数组
首先咱们有两个数列\(\{f_i\}\)和数列\(\{g_i\}\),他们之间知足
\[g_n=\sum_{i=0}^n a[n][i]f_i\]
这里咱们能够经过\(\{f_i\}\)的值推出\(\{g_i\}\)。
那么反演过程就是找到一个数组\(b\),使得可以用\(\{g_i\}\)的值,反推出\(\{f_i\}\)的值。
也就是
\[f_n=\sum_{i=0}^n b[n][i]g_i\]
若是只经过上面两个式子来考虑的话,事实上这就是一个反解线性方程组的过程,然而实际上整个方程组已是一个下三角的形式了,所以咱们能够考虑更加快捷的方式来进行计算。函数
这里给出克罗内克函数
\[\delta(i,j)=\begin{cases}1&i=j\\0&i\neq j\end{cases}\]
只是为了后面的书写的方便而介绍这个函数。spa
考虑反演的过程
\[f_n=\sum_{i=0}^n b[n][i]g_i\]
咱们把\(g_i\)的计算式直接带入当前式子,那么就会获得:
\[\begin{aligned}f_n=\sum_{i=0}^n b[n][i]g_i&=\sum_{i=0}^n b[n][i]\sum_{j=0}^ia[i][j]f_j\\&=\sum_{i=0}^n f_i\sum_{j=i}^nb[n][j]*a[j][i]\end{aligned}\]
考虑每个\(f_i\)前面的系数,显然只有\(f_n\)的系数为\(1\)。
所以\(a,b\)之间的关系能够简单的写成。
\[\sum_{j=i}^nb[n][j]*a[j][i]=\delta(n,i)\]
同理,把\(f\)带入到\(g\)的求和式中,能够推出
\[\sum_{j=i}^na[n][j]*b[j][i]=\delta(n,i)\]递归
若是知足这两个式子的话,那么意味着反演也是成立的。
然而这样子很虚幻,由于看起来也不知道有什么用,那么接下来就带入具体的东西来写QwQ。数学
这个玩意彷佛常常在容斥里面用到,或者说本质上就是一个容斥。
它的式子能够写成这个样子:
\[\begin{aligned}f_n&=\sum_{i=0}^n(-1)^i{n \choose i}g_i\\g_n&=\sum_{i=0}^n(-1)^i{n\choose i}f_i\end{aligned}\]
正反看起来是如出一辙的。
或者说写成更加常见的一种形式
\[\begin{aligned}f_n&=\sum_{i=0}^n{n\choose i}g_i\\g_n&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}f_i\end{aligned}\]
证实的话直接相似前面把\(f_i\)带入\(g_n\)的求和式之中,经过组合数的化简便可简单的证实。
\[\begin{aligned}g_n&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}f_i\\&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}\sum_{j=0}^i{i\choose j} g_j\\&=\sum_{j=0}^n g_i\sum_{i=j}^n{n\choose i}{i\choose j}(-1)^{n-i}\\&=\sum_{j=0}^n g_j\sum_{i=j}^n{n\choose j}{n-j\choose i-j}(-1)^{n-i}\\&=\sum_{j=0}^n g_j({n\choose j}\sum_{i=j}^n{n-j\choose i-j}(-1)^{n-i})\\&=\sum_{j=0}^n g_j({n\choose j}\sum_{i=0}^{n-j}{n-j\choose i}(-1)^{n-j-i})\\&=\sum_{j=0}^n g_j({n\choose j}(1-1)^{n-j})\\&=g_n\end{aligned}\]class
固然,还能够写成这个样子:
\[ \begin{aligned} f_k&=\sum_{i=k}^n{i\choose k}g_i\\ g_k&=\sum_{i=k}^n{i\choose k}f_i(-1)^{i-k} \end{aligned} \]
证实同理。方法
求彻底错位的排列方案数,即不存在\(p_i=i\)的排列\(\{p\}\)的个数。im
这个是有递推作法的,可是由于这里在写二项式反演,因此不考虑其余的作法。
设\(f_i\)表示刚好有\(i\)个位置时知足不存在\(p_k=k\)的方案数,也就是答案。
那么咱们推出一个式子:
\[n!=\sum_{i=0}^n{n\choose i}f_i\]
即枚举哪些位置知足\(p_k=k\),剩下位置强制知足错排关系,这样子就可以不重不漏的计算出\(n!\)个排列。
这样一来令\(g_n=n!\),有二项式反演的式子:
\[f_n=\sum_{i=0}^n(-1)^{n-i}{n\choose i}g_i=n!\sum_{i=0}^n\frac{(-1)^i}{i!}\]总结
有\(1\times n\)的一排格子,有\(m\)种颜色,每一个格子染一个颜色,相邻格子颜色不能相同,每种颜色都至少被用到\(1\)次,求染色方案数。di
若是不考虑每一个颜色都要被用一次的话,答案显然就是\(m*(m-1)^{n-1}\),这样也就是至多用了\(m\)种颜色。
设\(f_i\)表示刚好用了\(i\)种颜色的方案数,那么与之对应的设\(g_i\)表示至多用了\(i\)种颜色的方案数。
那么咱们推出一个转移:
\[g_m=m*(m-1)^{n-1}=\sum_{i=0}^n {n\choose i}f_i\]
二项式反演获得:
\[f_m=\sum_{i=0}^m(-1)^{m-i}{m\choose i}g_i\]
其余还有些题目之类的东西懒得写了QwQ。
\(\begin{bmatrix}n\\m\end{bmatrix}\)表示\(n\)个元素分红\(m\)个环的方案数。
那么递推式很显然:
\[\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}\]
即考虑先前已经放好的\(n-1\)个数,当前新加入的这个元素有两种选择,第一种是本身成一个环,贡献是\(\begin{bmatrix}n-1\\m-1\end{bmatrix}\);第二种是放到环内,那么它能够放在任意一个数的前面,因此就是\((n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}\)。
为了好写,接下来可能就偷懒写成\(S_1(n,m)\)了。
这几个式子仍是颇有用的,揭示了第一类斯特林数和降低幂之间的关系,而降低幂很明显能够写成排列的形式,也说明了第一类斯特林数和组合计数之间有着紧密的联系。
第一类斯特林数的生成函数能够写成:
\[\sum_{i=0}^n S_1(n,i)x^i=\prod_{i=0}^{n-1}(x+i)\]
获得的方法很简单,把\(n\)为定值时的全部的第一类斯特林数按照\(n\)分类分红行,发现每次的\(S_1(n,m)\)转移一定要从\(n-1\)行转移过来,而每次转移都是\(m-1\)变到\(m\),系数为\(1\),所以有一项\(x\),同理有一项\(n-1\),所以就能够获得上面的那个生成函数。
考虑如何预处理整行第一类斯特林数,用上述式子能够直接分治+\(FFT\)作到\(O(nlog^2n)\)。
实际上有一种只须要一个\(log\)的倍增方法。(问了lun终于懂了)
令\(\displaystyle F_n(x)=\prod_{i=0}^{n-1}(x+i)\),则有\(F_{2n}(x)=F_n(x)F_{n}(x+n)\)。
\(F_n(x)\)咱们递归求得其答案,如今考虑如何利用\(F_n(x)\)快速求出\(F_n(x+n)\)。
在这里咱们假设\(\displaystyle F_n(x)=\sum_{i=0}^{n-1} a_i x^i\)
\[\begin{aligned} F_n(x+n)&=\sum_{i=0}^{n-1}a_i (x+n)^i\\ &=\sum_{i=0}^{n-1}a_i\sum_{j=0}^i{i\choose j}n^{i-j}x^j\\ &=\sum_{i=0}^{n-1}(\sum_{j=i}^n {j\choose i}n^{j-i}a_j)x^i \end{aligned}\]
括号内的部分拆开以后,能够分红差相等的两个部分,意味着能够翻转以后卷积。
那么每次递归前一半,后面一半卷积求解便可获得答案。
时间复杂度为一个\(log\)。
这个其实原来我写过一次啦QwQ。
\(\begin{Bmatrix}n\\m\end{Bmatrix}\)表示将\(n\)个元素放入\(m\)个相同盒子里,每一个盒子非空的方案数。
递推式和上面相似
\[\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m*\begin{Bmatrix}n-1\\m\end{Bmatrix}\]
考虑最后放入的元素是新建一个盒子仍是放入一个原有的盒子便可。
后面偷懒写成\(S_2(n,m)\)的形式。
上述式子是直接递推,事实上第二类斯特林数有容斥计算的方法。
\[S_2(n,m)=\frac{1}{m!}\sum_{i=0}^m(-1)^i{m\choose i}(m-i)^n\]
即先将盒子编号,最后结果出去顺序便可。考虑有几个盒子为空,枚举出来,而后剩下的元素随便放在非空的盒子里,由于这里算完以后是至少\(i\)个盒子为空,因此须要容斥。
这个式子拆开组合数以后能够写成卷积的形式,意味着咱们能够在一个\(log\)的复杂度里求解\(S(n,i),i\in[0,n]\)。
这里和天然数幂之间有一个式子
\[m^n=\sum_{i=0}^mS_2(n,i){m\choose i}i!\]
\(m^n\)理解为把\(n\)个球任意放到\(m\)个有区别的盒子中,那么咱们枚举哪些盒子非空,而后放进去的方案数就是第二类斯特林数乘阶乘。
固然,事实上上面的这个式子也能够写成上升幂和降低幂的形式
\[ \begin{aligned}m^n&=\sum_{i=0}^mS_2(n,i){m\choose i}i!\\&=\sum_{i=0}^mS_2(n,i)\frac{m!}{(m-i)!}\\&=\sum_{i=0}^mS_2(n,i)m^{\underline i}\end{aligned} \]
upd:补充一个天然数幂和的式子:
\[\begin{aligned} S(n)&=\sum_{i=1}^n i^k\\ &=\sum_{i=1}^n\sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=1}^ni^{\underline j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum_{i=1}^n{i\choose j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!{n+1\choose j+1}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\frac{(n+1)^{\underline {j+1}}}{j+1} \end{aligned}\]
中间有一步\(\displaystyle \sum_{i=1}^n{i\choose j}={n+1\choose j+1}\),这个的证实能够理解为从\(n+1\)个位置中选择\(j+1\)个位置,先肯定最靠左的那个求的位置,咱们枚举其位置,这样子剩下的位置就是\(n+1-i\)个,从中选出\(j\)个,就是上述式子了。
这样子用第二类斯特林数计算天然数幂和就不须要考虑求逆的问题了。
直接摆式子吧
\[ \begin{aligned} f(n)&=\sum_{i=1}^n \begin{Bmatrix}n\\i\end{Bmatrix}g(i)\\ g(n)&=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f(i)\end{aligned} \]
为了证实这个东西咱们接下来能够补一堆式子啦。
首先这个东西叫作反转公式
\[\begin{cases}\sum_{k=m}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}=\delta(n,m)\\\sum_{k=m}^n(-1)^{n-k}\begin{bmatrix}k\\m\end{bmatrix}\begin{Bmatrix}n\\k\end{Bmatrix}=\delta(n,m)\end{cases}\]
仔细想一想,这不就是上面反演若是成立的话须要知足的两个式子吗?
因此只须要证实反转公式成立,那么相似前面的带入方法,就能够证实斯特林反演。
咱们先考虑几个很显然的式子就能够很方便的帮忙证实反转公式了。
\(x^{\underline n}=(-1)^n (-x)^{\overline n}\)
\(x^{\overline n}=(-1)^n (-x)^{\underline n}\)
这两个式子很显然,就不证实了。
接下来咱们就能够来推式子了。
\[\begin{aligned} n^m&=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}n^{\underline i}\\ &=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i(-n)^{\overline i}\\ &=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i\sum_{j=0}^i \begin{bmatrix}i\\j\end{bmatrix}(-n)^j\\ &=\sum_{j=0}^m (-n)^j\sum_{i=j}^m\begin{Bmatrix}m\\i\end{Bmatrix}\begin{bmatrix}i\\j\end{bmatrix}(-1)^i\\ &=\sum_{j=0}^m n^j\sum_{i=j}^m\begin{Bmatrix}m\\i\end{Bmatrix}\begin{bmatrix}i\\j\end{bmatrix}(-1)^{i+j} \end{aligned}\]
显然当且仅当\(j=m\)时后面那堆式子才为\(1\)。
那么就证实了反转公式的一半,另一半显然能够同理证实。
这样一来斯特林反演就证实完了。
能够说是咱们最熟悉的反演了。主要用于和约数相关的关系。
\[ \begin{aligned} g(n)&=\sum_{d|n}f(d)\\ f(n)&=\sum_{d|n}g(d)\mu(\frac{n}{d}) \end{aligned} \]
证实,直接带进去来爆算:
\[ \begin{aligned} g(n)&=\sum_{d|n}f(d)\\ &=\sum_{d|n}\sum_{dd|d}g(dd)\mu(\frac{d}{dd})\\ &=\sum_{dd|n}g(dd)\sum_{d|n,dd|d}\mu(\frac{d}{dd})\\ &=\sum_{dd|n}g(dd)\sum_{d|(n/dd)}\mu(d)\\ &=\sum_{dd|n}g(dd)\delta(n,dd)\\ &=g(n) \end{aligned} \]
这里利用了\(\sum_{d|n}\mu(d)=\delta(n,1)\)
还有另一种形式,和二项式反演的另一种形式很相似。
\[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_{n|d}g(d)\mu(\frac{d}{n})\end{aligned}\]
证实方法相似。
单独分开一篇总结QwQ