斯特林数及斯特林反演

第一类斯特林数

第一类斯特林数一般记为(displaystyle egin{bmatrix} n\k end{bmatrix}),组合意义将(n)个小球分为(k)个圆环的方案数。因此有递推式:

[egin{bmatrix} n \ k end{bmatrix}=egin{bmatrix} n - 1 \ k - 1 end{bmatrix} + ncdot egin{bmatrix} n - 1 \ k end{bmatrix} ]

递推式也比较好理解:现在考虑放第(n)个小球,那么有两种情况:一种是其单独成为一个环,另一种情况是放在其余某个小球的左边/右边。两种情况加起来就是答案。

性质

  • (displaystyle egin{bmatrix} n \ 1 end{bmatrix}=(n-1)!)

这就相当于一个环排列。

  • (displaystyle n!=sum_{i=0}^n egin{bmatrix} n \ i end{bmatrix})

第一类斯特林数的本质是环排列的个数,而每一个环其实就相当于一个置换。那么这里相当于枚举了所有的置换,所有的置换方案数即为(n!)

  • (displaystyle x^{underline{n}}=sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}x^i)

这个式子数学归纳法即可证明:

[egin{aligned} x^{underline{n+1}}=&(x-n)x^{underline{n}}\ =&(x-n)sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}x^i\ =&sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n\i end{bmatrix}x^{i+1}-nsum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}x^i\ =&sum_{i=1}^{n+1}(-1)^{n+1-i}egin{bmatrix} n \ i - 1 end{bmatrix}x^i+nsum_{i=0}^{n+1}(-1)^{n+1-i}egin{bmatrix} n \ i end{bmatrix}x^i\ =&sum_{i=0}^{n+1}(-1)^{n+1-i}egin{bmatrix} n \ i - 1 end{bmatrix}x^i+nsum_{i=0}^{n+1}(-1)^{n+1-i}egin{bmatrix} n \ i end{bmatrix}x^i\ =&sum_{i=0}^{n+1}(-1)^{n+i-1}egin{bmatrix} n + 1 \ i end{bmatrix}x^i end{aligned} ]

注意一下上下界的变化,巧妙地凑出了(displaystyle egin{bmatrix} n + 1 \ i end{bmatrix})

  • (displaystyle x^{overline{n}}=sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}x^i)

这个用数学归纳法同理可证。

这几个式子揭示了上、下降幂与斯特林数的联系,其中下降幂显然可以表示成排列的形式,这也说明斯特林数与排列组合之间有冥冥的联系。

预处理
有时候需要快速得到一行的第一类斯特林数的值,我们直接递推预处理的话时间复杂度较高,下面介绍一种(O(nlogn))求解的方法。
显然第一类斯特林数的生成函数为:

[sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}x^i=prod_{i=0}^{n-1}(x+i) ]

之后令(displaystyle F_n(x)=prod_{i=0}^{n-1}(x+i)),那么(displaystyle F_{2n}(x)=F_n(x)cdot F_n(x+n)),接下来就又是推式子啦:

[egin{aligned} F_{n}(x+n)=&prod_{i=0}^{n-1}(x+n+i)\ =&sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}(x+n)^i\ =&sum_{i=0}^n egin{bmatrix} n \ i end{bmatrix}sum_{j=0}^i {ichoose j} x^jn^{i-j}\ =&sum_{j=0}^nfrac{x^j}{j!}sum_{i=j}^n egin{bmatrix} n \ i end{bmatrix}i!cdot frac{n^{i-j}}{(i-j)!} end{aligned} ]

观察到后半部分其实是一个减法卷积的形式,那么我们在这里通过(FFT)即可快速求解后半部分的答案,最后乘以(displaystylefrac{1}{j!})即可快速得到(displaystyle F_n(x+n))
那么(displaystyle F_n(x)cdot F_{n}(x+n)=F_{2n}(x)),我们再做一次乘法运算,就可以通过(F_n(x))快速得到(F_{2n}(x))了。

这里减法卷积的话,我们只需要将其中一个多项式翻转一下,然后将结果再翻转一下即可得到答案。

第二类斯特林数

第二类斯特林数记为(displaystyle egin{Bmatrix} n \ k end{Bmatrix}),表示将(n)个数划分为(k)个非空集合的方案数。
那么根据这个则有递推式:

[egin{Bmatrix} n \ k end{Bmatrix}=egin{Bmatrix} n - 1 \ k - 1 end{Bmatrix}+kegin{Bmatrix} n - 1 \ k end{Bmatrix} ]

也是分两种情况,稍有不同的是这里是集合,所以我们乘的是(k)
下面直接将第二类斯特林数记为(displaystyle S(n,k))

性质

  • (displaystyle S(n,k)=frac{1}{k!}sum_{i=0}^k(-1)^i{kchoose i}(k-i)^n)

等式右边就是一个容斥,枚举有多少个空集合来进行容斥,当我们确定了(i)个空集合后,其余随便选就行。

  • (displaystyle n^m=sum_{i=0}^n S(m,i)cdot i!cdot {nchoose i})

左边就相当于将(m)个小球放入(n)个盒子内,但可能存在空盒子;右边就相当于枚举有多少个非空的盒子,之后将所有情况加起来。显然两者相等。
注意一下,这里求和上界(n,m)都可以,不影响最终答案。

通过这个式子,我们可以用来求解自然数幂和:

[egin{aligned} S(n)=&sum_{i=1}^ni^k\ =&sum_{i=1}^{n}sum_{j=0}^kS(k,j)cdot j!cdot {ichoose j}\ =&sum_{j=0}^{k}S(k,j)cdot j!sum_{i=0}^n{ichoose j}\ =&sum_{j=0}^k S(k,j)cdot j!cdot {n + 1choose j + 1}\ end{aligned} ]

这样就可以在(O(k))的时间复杂度内求出答案了,跟拉格朗日插值的时间复杂度一致。

预处理
同第一类斯特林数一样,如果我们需要预处理出某一整行的第二类斯特林数的话,直接递推是很麻烦的,我们有更加快速的方法。
我们可以借助第二类斯特林数的通项来求解:

[egin{aligned} S(n,k)=&frac{1}{k!}sum_{i=0}^k(-1)^i{kchoose i}(k-i)^n\ =&sum_{i=0}^kfrac{(-1)^i}{i!}cdot frac{(k - i)^n}{(k-i)!} end{aligned} ]

显然这就是一个普通的卷积,那么我们就可以在(O(nlogn))的时间内快速求解了。

斯特林反演

如果有:

[f(n)=sum_{i=0}^{n}egin{Bmatrix} n \ i end{Bmatrix}g(i) ]

则有:

[g(n)=sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}f(i) ]

感觉跟二项式反演有点像?

证明的话需要一个叫做反转公式的东西:

[egin{aligned} sum_{k=m}^{n}(-1)^{n-k}egin{bmatrix} n \ k end{bmatrix}egin{Bmatrix} k \ m end{Bmatrix}=[n=m]\ sum_{k=m}^{n}(-1)^{n-k}egin{Bmatrix} n \ k end{Bmatrix}egin{bmatrix} k \ m end{bmatrix}=[n=m] end{aligned} ]

然后还需要知道上升阶乘幂和下降阶乘幂之间的关系:

[egin{aligned} x^{underline{n}}=(-1)^n(-x)^{overline{n}}\ x^{overline{n}}=(-1)^n(-x)^{overline{n}} end{aligned} ]

然后就开始推式子:

[egin{aligned} n^m=&sum_{i=0}^m egin{Bmatrix}m\iend{Bmatrix}cdot i!cdot {nchoose i}\ =&sum_{i=0}^{m}egin{Bmatrix}m\iend{Bmatrix}n^{underline{i}}\ =&sum_{i=0}^megin{Bmatrix}m\iend{Bmatrix}(-1)^i(-n)^{overline{i}}\ =&sum_{i=0}^megin{Bmatrix}m\iend{Bmatrix}(-1)^isum_{j=0}^iegin{bmatrix} i \ j end{bmatrix}(-n)^j\ =&sum_{j=0}^m n^jsum_{i=j}^{m}egin{Bmatrix}m\iend{Bmatrix}egin{bmatrix} i \ j end{bmatrix}(-1)^{i-j} end{aligned} ]

这是第二个反转公式的形式,注意最后(-1)的指数也可以写为(n-i)。我们可以分两种情况考虑:第一种(j=m)时显然两个都一样;第二种(j ot ={m})时,后面那部分为(0),所以多个正负号没用。
然后我们来推第一个反转公式:

[egin{aligned} x^{underline{n}}=&sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}x^i\ =&sum_{i=0}^{n}egin{bmatrix} n \ i end{bmatrix}(-1)^{n-i}sum_{j=0}^i{xchoose j}egin{Bmatrix} i \ j end{Bmatrix}j!\ =&sum_{j=0}^nx^{underline{j}}sum_{i=j}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}egin{Bmatrix} i \ j end{Bmatrix} end{aligned} ]

显然也只有当(j=n)时,后半部分为(1)

那么我们就已经证明了反转公式了。
接下来再来证明斯特林反演:
假如有:

[g(n)=sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}f(i) ]

那么:

[egin{aligned} f(n)=&sum_{i=0}^{n}[i=n]f(i)\ =&sum_{i=0}^nsum_{j=i}^n(-1)^{j-i}egin{Bmatrix} n \ j end{Bmatrix}egin{bmatrix} j \ i end{bmatrix}f(i)\ =&sum_{j=0}^negin{Bmatrix} n \ j end{Bmatrix}sum_{i=0}^j (-1)^{j-i}egin{bmatrix} j \ i end{bmatrix}f(i)\ =&sum_{j=0}^{n}egin{Bmatrix} n \ j end{Bmatrix}g(j) end{aligned} ]

假如有

[f(n)=sum_{j=0}^negin{Bmatrix} n \ j end{Bmatrix}g(j) ]

那么:

[egin{aligned} g(n)=&sum_{i=0}^n[i=n]g(i)\ =&sum_{i=0}^nsum_{j=i}^n(-1)^{n-j}egin{bmatrix} n \ j end{bmatrix}egin{Bmatrix} j \ i end{Bmatrix}g(i)\ =&sum_{j=0}^n(-1)^{n-j}egin{bmatrix} n \ j end{bmatrix}sum_{i=0}^jegin{Bmatrix} j \ i end{Bmatrix}g(i)\ =&sum_{j=0}^n(-1)^{n-j}egin{bmatrix} n \ j end{bmatrix}f(j) end{aligned} ]

所以斯特林反演就证完啦。

斯特林数反演还有另外一种类似的形式:
已知

[f_i=sum_{j=i}^negin{Bmatrix} j \ i end{Bmatrix}g_j ]

那么

[g_i=sum_{j=i}^n(-1)^{j-i}egin{bmatrix} j \ i end{bmatrix}f_j ]

同样通过反转公式容易得证。

最后再附上几个比较有意思的式子:

[egin{aligned} &x^n=sum_{i=0}^{x}{xchoose i}i!egin{Bmatrix} n \ i end{Bmatrix} =sum_{i=0}^{x}egin{Bmatrix} n \ i end{Bmatrix}n^{underline{i}}\ &x^n=sum_{i=0}^x(-1)^{x-i}egin{Bmatrix} n \ i end{Bmatrix}n^{underline{i}}\ &x^{overline{n}}=sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}x^i\ &x^{underline{n}}=sum_{i=0}^n(-1)^{n-i}egin{bmatrix} n \ i end{bmatrix}x^i end{aligned} ]

第二个式子的证明直接将第一个式子中的(x)换为(-x)就行了。
这几个式子感觉很好说明了第一类斯特林数、第二类斯特林数以及自然数幂和之间的关系~

原文地址:https://www.cnblogs.com/heyuhhh/p/12051119.html