推数学式子的时候不仅要从组合意义上把式子的意义完完全全理解,还要从实际问题的边界条件出发检验式子的正确性!所有组合计数题一定要把式子一遍推正确,因为根本没法再调试找到错误,太浪费时间了!
关于反演的本质:
变换和逆变换: f = A ∗ g , g = B ∗ f 且 A B = I ( A , B 互 为 逆 矩 阵 ) f = A * g , g = B * f 且 AB = I (A,B互为逆矩阵) f=A∗g,g=B∗f且AB=I(A,B互为逆矩阵)
解线性方程组找到两个序列的关系。详细在这里
这个讲义给我最大的收获是推二元卷积式子时候:把贡献的条件拆开,对两部分分别变换,乘起来再逆变换,而这两个变换还可能不同。
比如最后一题子集卷积:多记录一维状态,把集合大小考虑进去,就能很好分拆了
另外多层反演的时候,把每一层中与相同变量相关的部分设为相同函数,然后再观察式子的已知、未知部分,多次反演
这是例题
所有反演的推到和证明都可以利用最基本的繁衍式子:
f n = ∑ i = 0 n b [ n ] [ i ] g i = ∑ i = 0 n b [ n ] [ i ] ∑ j = 0 i a [ i ] [ j ] f j = ∑ i = 0 n f i ∑ j = i n b [ n ] [ j ] ∗ a [ j ] [ 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} fn=i=0∑nb[n][i]gi=i=0∑nb[n][i]j=0∑ia[i][j]fj=i=0∑nfij=i∑nb[n][j]∗a[j][i]
因此a,b之间的关系可以简单的写成: ∑ j = i n b [ n ] [ j ] ∗ a [ j ] [ i ] = δ ( n , i ) \sum_{j=i}^nb[n][j]*a[j][i]=\delta(n,i) j=i∑nb[n][j]∗a[j][i]=δ(n,i)
1. 二项式反演(贡献关系是组合形式)
二项式反演就是把精确值转换成>=或<=,注意多贡献的值是一个组合数,而不是直接减去f[k-1]
找方程,最后反演求解
例题
2. 斯特林数反演
仍然引用大佬的介绍from yyb
斯特林数是把p次多项式线性空间的两组基:A=(1,x,x2,…,xp) , B=(1,[x]1,…,[x]p)相互变换的系数。
其中,第一类斯特林数的是:A到B,即下降(上升)幂,到xp,第二类斯特林数是B到A,即xp到降(上升)幂
这个推到可以直接用数学归纳法,作差证明。甚至在《组合数学》中,把斯特林数定义成了这个系数,然后推到出了斯特林数的递推式
斯特林数的求法
第一类:写成生成函数: ∑ i = 0 n S 1 ( n , i ) x i = ∏ i = 0 n − 1 ( x + i ) \sum_{i=0}^n S_1(n,i)x^i=\prod_{i=0}^{n-1}(x+i)