第一类斯特林数
在这里我因为懒所以还是用(S(n,m))表示第一类斯特林数,但一定要和第二类斯特林数区分开来
递推式
(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1))
其中(S(0,0)=1,S(i,0)=0(i>0))
组合意义
(n)个元素组成(m)个圆排列的方案数
注意这里圆排列指的是两个排列经过旋转能重合的算一种方案
那么递推式就可以这样理解:对于当前的第(n)个元素,单独成一个圆排列有(S(n-1,m-1))种方案,放在其它的圆排列中有(S(n-1,m)*(n-1))种方案,即放在每个元素的左侧(右侧等价于另一个元素的左侧)
性质
1、(S(n,1)=(n-1)!)
圆排列定义
2、(sum_{i=1}^{n}S(n,i)=n!)
我们知道(1-n)这(n)个元素能形成(n!)个个排列,也就是(n!)个置换,而将置换写成循环的形式,这又对应着一个圆排列,于是就建立起了(n)排列和第一类斯特林数一一对应的关系
3、(x^underline{n}=sum_{i=0}^nS(n.i)(-1)^{n-i}x^i),(x^overline{n}=sum_{i=0}^nS(n,i)x^i)
证明的话考虑数学归纳法,这里仅给出第一条的证明
[egin{aligned}
x^{underline{n+1}}=&(x-n)x^{underline{n}}\
=&(x-n)sum_{i=0}^nS(n,i)(-1)^{n-i}x^i\
=&sum_{i=0}^nS(n,i)(-1)^{n-i}x^{i+1}-nsum_{i=0}^nS(n,i)(-1)^{n-i}x^i\
=&sum_{i=1}^{n+1}S(n,i-1)(-1)^{n-i+1}x^i+nsum_{i=0}^nS(n.i)(-1)^{n-i+1}x^i\
=&sum_{i=0}^{n}(S(n,i-1)+nS(n.i))(-1)^{n-i}x^i\
=&sum_{i=0}^{n}S(n+1,i)(-1)^{n-i}x^i
end{aligned}
]
求解第一类斯特林数
最普通的方法就是(O(n^2))的递推啦,考虑有没有更优的方法
我们先丢结论:
[S(n,m)=[x^m]prod_{i=0}^{n-1}(x+i)
]
计算右式的话可以使用分治+NTT在(O(nlog^2n))的时间内解决,但是这么做的理由是什么?
设现在求的是(S(n,m))我们记(f_n(x)=prod_{i=0}^{n-1}(x+1)),然后把这个式子写成类似于递推的形式:
[f_n(x)=(x+n-1)f_{n-1}(x)=xf_{n-1}(x)+(n-1)f_{n-1}(x)
]
第一项(xf_{n-1}(x))就相当于(S(n-1,m-1)),第二项((n-1)f_{n-1}(x))就相当于((n-1)*S(n-1,m)),也就是说这个式子对应的递推式就是(S(n,m)=S(n-1,m-1)+(n-1)*S(n-1,m)),正确性也就显然了