本文主要是介绍第一类第二类斯特林数学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一类斯特林数
p p p个不同人围着 k k k个不同圆桌坐,要求每桌非空,方案数即为 S ( p , k ) S(p,k) S(p,k)
递推
边界
S ( p , p ) = 1 ( p > = 0 ) , S ( p , 0 ) = 0 ( p > = 1 ) S(p,p)=1(p>=0),S(p,0)=0(p>=1) S(p,p)=1(p>=0),S(p,0)=0(p>=1)
分类讨论一下…
新加入的人可以新开一张桌子,前面的方案即为 S ( p − 1 , k − 1 ) S(p-1,k-1) S(p−1,k−1)
也可以和之前的人坐,先把前面的人安排好了的方案数是 S ( p − 1 , k ) S(p-1,k) S(p−1,k),我们让这个人任选一个人,坐在他的左边,方案数即为 ( p − 1 ) ∗ S ( p − 1 , k ) (p-1)*S(p-1,k) (p−1)∗S(p−1,k)
综上,转移即为
S ( p , k ) = S ( p − 1 , k − 1 ) + ( p − 1 ) ∗ S ( p − 1 , k ) S(p,k)=S(p-1,k-1)+(p-1)*S(p-1,k) S(p,k)=S(p−1,k−1)+(p−1)∗S(p−1,k)
复杂度 O ( n 2 ) O(n^2) O(n2)
性质
第一类斯特林数 S ( n , m ) S(n,m) S(n,m)其实可以表示为 x x x的 n n n次上升幂的第 m m m项系数,即有
x n ↑ = x ( x + 1 ) ( x + 2 ) ⋯ ( x + n − 1 ) = ∑ i = 0 n s ( n , i ) x i x^{n \uparrow} = x(x + 1)(x + 2) \cdots (x + n - 1) =\sum_{i = 0}^n s(n, i) x^i xn↑=x(x+1)(x+2)⋯(x+n−1)=i=0∑ns(n,i)xi
可以分治NTT或FFT求出,复杂度 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)
某个式子
n ! = ∑ i = 0 n s ( n , i ) n!=\sum _{i=0}^{n}s(n,i) n!=i=0∑ns(n,i)
证明考虑任意一个排列对应了唯一一个置换,一个置换可以看作一个轮换,于是轮换与置换,排列一一对应,右边相当于枚举所有轮换,由此得证
另一个重要式子
x n ‾ = ∑ i = 0 n s ( n , i ) ( − 1 ) n − i x i x^{\underline{n}}=\sum_{i=0}^{n}s(n,i)(-1)^{n-i}x^i xn=i=0∑ns(n,i)(−1)n−ixi
证明考虑归纳
x n + 1 ‾ = x n ‾ ( x − n ) = x ∗ x n ‾ − n ∗ x n ‾ = ∑ i = 0 n s ( n , i ) ( − 1 ) n − i x i + 1 − n ∑ i = 0 n s ( n , i ) ( − 1 ) n − i x i = ∑ i = 1 n + 1 s ( n , i − 1 ) ( − 1 ) n − i + 1 x i + n ∑ i = 1 n + 1 s ( n , i ) ( − 1 ) n − i + 1 x i = ∑ i = 1 n + 1 ( s ( n , i − 1 ) + n ∗ s ( n , i ) ) ( − 1 ) n − i + 1 x i = ∑ i = 1 n + 1 s ( n + 1 , i ) ( − 1 ) n − i + 1 x i x^{\underline{n+1}}=x^{\underline{n}}(x-n)\\=x*x^{\underline n}-n*x^{\underline n}\\=\sum_{i=0}^{n}s(n,i)(-1)^{n-i}x^{i+1}-n\sum_{i=0}^{n}s(n,i)(-1)^{n-i}x^i\\=\sum_{i=1}^{n+1}s(n,i-1)(-1)^{n-i+1}x^i+n\sum_{i=1}^{n+1}s(n,i)(-1)^{n-i+1}x^{i}\\=\sum_{i=1}^{n+1}(s(n,i-1)+n*s(n,i))(-1)^{n-i+1}x^i\\=\sum_{i=1}^{n+1}s(n+1,i)(-1)^{n-i+1}x^i xn+1=xn(x−n)=x∗xn−n∗xn=i=0∑ns(n,i)(−1)n−ixi+1−ni=0∑ns(n,i)(−1)n−ixi=i=1∑n+1s(n,i−1)(−1)n−i+1xi+ni=1∑n+1s(n,i)(−1)n−i+1xi=i=1∑n+1(s(n,i−1)+n∗s(n,i))(−1)n−i+1xi=i=1∑n+1s(n+1,i)(−1)n−i+1xi
注意这个多项式的常数项一定为 0 0 0所以可以不予考虑,得证
n log n n\log n nlogn推出第一类斯特林数
由上可知第一类斯特林数可以用下降幂来搞,但是存在正负性不好考虑,所以用上升幂
设 f ( x ) = x n ‾ , g ( x ) = ( x + n ) n ‾ f(x)=x^{\underline n},g(x)=(x+n)^{\underline n} f(x)=xn,g(x)=(x+n)n,显然 f ( x ) g ( x ) = x 2 n ‾ f(x)g(x)=x^{\underline {2n}} f(x)g(x)=x2n,这个其实是我们上面分治 N T T NTT NTT的过程,现在我们不考虑递归两侧,直接递归一侧来算出另一侧,于是
f ( x ) = ∑ i = 0 n a i x i 则 g ( x ) = ∑ i = 0 n a i ( x + n ) i = ∑ i = 0 n a i ∑ j = 0 i ( i j ) x j n i − j = ∑ j = 0 n ( ∑ i = j n a i ( i j ) n i − j ) x j f(x)=\sum_{i=0}^{n}a_ix^i\\则g(x)=\sum_{i=0}^{n}a_i(x+n)^i\\=\sum_{i=0}^{n}a_i\sum_{j=0}^{i}\binom{i}{j}x^jn^{i-j}\\=\sum_{j=0}^{n}(\sum_{i=j}^na_i\binom{i}{j}n^{i-j})x^j f(x)=i=0∑naixi则g(x)=i=0∑nai(x+n)i=i=0∑naij=0∑i(ji)xjni−j=j=0∑n(i=j∑nai(ji)ni−j)xj
中间是个卷积,直接卷就行了,然后再当前层再卷一次
注意我们强行把当前层看作了偶数,如果是奇数再把最后一项暴力乘上去就行了
复杂度就变为 n log n n\log n nlogn了
第二类斯特林数
n n n个不同球放入 m m m个相同盒子的方案数即为 S ( n , m ) S(n,m) S(n,m)
递推
仍然分类讨论
新加入的球可以新开一个盒子,即为 S ( n − 1 , m − 1 ) S(n-1,m-1) S(n−1,m−1)
或者在之前任选一个盒子放入,即为 m ∗ S ( n − 1 , m ) m*S(n-1,m) m∗S(n−1,m)
综上所述,有
S ( n , m ) = S ( n − 1 , m − 1 ) + m ∗ S ( n − 1 , m ) S(n,m)=S(n-1,m-1)+m*S(n-1,m) S(n,m)=S(n−1,m−1)+m∗S(n−1,m)
复杂度 O ( n 2 ) O(n^2) O(n2)
容斥原理
我们可以枚举至少有多少个盒子是空的,剩下的盒子随便放
那么有
S ( n , m ) = 1 m ! ∑ k = 0 m ( − 1 ) k C m k ( m − k ) n S(n,m)=\frac{1}{m!}\sum_{k=0}^{m}(-1)^kC_m^k(m-k)^n S(n,m)=m!1k=0∑m(−1)kCmk(m−k)n
再推一下会有
= 1 m ! ∑ k = 0 m ( − 1 ) k m ! k ! ( m − k ) ! ( m − k ) n =\frac{1}{m!}\sum_{k=0}^{m}(-1)^k\frac{m!}{k!(m-k)!}(m-k)^n =m!1k=0∑m(−1)kk!(m−k)!m!(m−k)n
= ∑ k = 0 m ( − 1 ) k k ! ∗ ( m − k ) n ( m − k ) ! =\sum_{k=0}^m\frac{(-1)^k}{k!}*\frac{(m-k)^n}{(m-k)!} =k=0∑mk!(−1)k∗(m−k)!(m−k)n
容易发现,这是一个卷积形式,组合数和次幂都可以预处理
于是可以通过FFT或者NTT求出 S ( n , 0 ) , S ( n , 1 ) . . . S(n,0),S(n,1)... S(n,0),S(n,1)...
复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
性质
n k = ∑ i = 0 m i n ( n , k ) S ( k , i ) ∗ i ! ∗ C n i n^k=\sum_{i=0}^{min(n,k)}S(k,i)*i!*C_n^i nk=i=0∑min(n,k)S(k,i)∗i!∗Cni
等式左边即为 k k k个不同小球放入 n n n个不同盒子的方案数
我们可以通过枚举放入了多少个盒子,即为 S ( k , i ) ∗ i ! S(k,i)*i! S(k,i)∗i!,由于第二类斯特林数中盒子是相同的所以我们需要乘一个 i ! i! i!
再在 n n n个盒子中选出 i i i个可知等式合法
这篇关于第一类第二类斯特林数学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!