斯特林数计算
门
总之我们可以理解斯特林数为
n人分
k组的方案。
考虑容斥,我们钦定至少有
m个组为
1,有:
ans=m=0∑n(−1)m(mn)k≥0∑Sn−m,k=m=0∑n(−1)n−m(mn)k≥0∑Sm,k
后面的sum等于其他任选的方案。
同时,上下两个式子显然是对称的。
根据oi wiki,我们可以知道其有通项公式
Sn,m=∑i=0mi!(m−i)!(−1)m−iin,那么整个式子变为了:
m=0∑n(−1)n−m(mn)k≥0∑i=0∑ki!(k−i!)(−1)k−iim=m=0∑n(−1)n−m(mn)k≥0∑k1i=0∑ki!(k−i)!k!(−1)k−iim=m=0∑n(−1)n−m(mn)k≥0∑k1i=0∑ki!(k−i)!k!(−1)k−iim=m=0∑n(−1)n−m(mn)k≥0∑k1i=0∑k(ik)(−1)k−iim交换求和顺序=k≥0∑k1i=0∑k(ik)(−1)k−im=0∑n(−1)n−m(mn)im
此时,最后那一坨看起来很容斥原理,思考其组合意义,可以发现其相当于钦定i个为1,其他在
1−j选的方案,可以转为
(i−1)n:
k≥0∑k1i=0∑k(ik)(−1)k−i(i−1)n
这个式子与
i与
k−i有关,分别设为
x,y 那么有:
x≥0∑(x+y)!1y≥0∑x+y(xx+y)(−1)y(x−1)n=x≥0∑y≥0∑x+yx!y!(−1)y(x−1)n=x+y≤n∑x!y!(−1)y(x−1)n
其余几项好解决,我们如何线性预处理
xn呢?
实际上很简单,我们用欧拉筛维护就行了,很容易O(n)。