第一类斯特林数
第一类斯特林数一般记为(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)就行了。
这几个式子感觉很好说明了第一类斯特林数、第二类斯特林数以及自然数幂和之间的关系~