第一类斯特林数
s(n,m)s(n,m) 表示 nn 个元素组成 个圆排列
有
s(n,m)=s(n−1,m−1)+s(n−1,m)∗(n−1)s(n,m)=s(n−1,m−1)+s(n−1,m)∗(n−1)
s(n,m)=∑i=1ns(n−i,m−1)(n−1i−1)(i−1)!s(n,m)=∑i=1ns(n−i,m−1)(n−1i−1)(i−1)!
xn¯¯¯=x(x+1)(x+2)...(x+n−1)=∑i=0ns(n,i)xixn¯=x(x+1)(x+2)...(x+n−1)=∑i=0ns(n,i)xi
怎么求呢?用 xn¯¯¯xn¯
直接展开 xn¯¯¯xn¯ ,分治 FFTFFT 可以 O(nlog2n)O(nlog2n)
更好的方法是倍增求 xn¯¯¯xn¯ :
x2n¯¯¯¯¯¯=xn¯¯¯(x+n)n¯¯¯x2n¯=xn¯(x+n)n¯
设 F(x,n)=xn¯¯¯F(x,n)=xn¯ ,G(x,n)=(x+n)n¯¯¯G(x,n)=(x+n)n¯
G(x,n)=∑j=in(ji)F(x,n)nj−iG(x,n)=∑j=in(ji)F(x,n)nj−i
这样是卷积形式,就能从 xn¯¯¯xn¯ 得到 (x+n)n¯¯¯(x+n)n¯ , O(nlogn)O(nlogn) 时间内求出一行 StirlingStirling 数 。
第二类斯特林数
S(n,m)S(n,m) 表示 nn 个元素分成 个集合的方案数。
有
S(n,m)=S(n,m−1)+S(n−1,m)∗mS(n,m)=S(n,m−1)+S(n−1,m)∗m
S(n,m)=1m!∑k=0m(−1)k(mk)(m−k)nS(n,m)=1m!∑k=0m(−1)k(mk)(m−k)n
根据组合意义可以得到
kn=∑i=0kAikS(n,i)=∑i=0ki!(ki)S(n,i)kn=∑i=0kAkiS(n,i)=∑i=0ki!(ki)S(n,i)
这里要用个东西叫二项式反演,大概是个容斥:
f(n)=∑i=0n(ni)g(i)⇒g(n)=∑i=0n(−1)n−i(ni)f(i)f(n)=∑i=0n(ni)g(i)⇒g(n)=∑i=0n(−1)n−i(ni)f(i)
用二项式反演得到
S(n,k)=1k!∑i=0k(−1)k−i(ki)i!=∑i=0k(−1)k−iini!(k−i)!S(n,k)=1k!∑i=0k(−1)k−i(ki)i!=∑i=0k(−1)k−iini!(k−i)!
然后一次FFT就好了。
注意 kn=∑ki=0AikS(n,i)kn=∑i=0kAkiS(n,i) 这个等式在推式子,算贡献时很有用,可以代换。