第一类&第二类斯特林数学习笔记

版权声明:蒻蒟的bolg... https://blog.csdn.net/Rose_max/article/details/85472358

第一类斯特林数

p p 个不同人围着 m m 个不同圆桌坐,要求每桌非空,方案数即为 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 1 , k 1 ) S(p-1,k-1)
也可以和之前的人坐,先把前面的人安排好了的方案数是 S ( p 1 , k ) 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)
复杂度 O ( n 2 ) O(n^2)

性质

第一类斯特林数 S ( n , m ) S(n,m) 其实可以表示为 x x n n 次上升幂的第 m m 项系数

x n = x ( x + 1 ) ( x + 2 ) ( x + n 1 ) = i = 0 n s ( n , k ) x k x^{n \uparrow} = x(x + 1)(x + 2) \cdots (x + n - 1) =\sum_{i = 0}^n s(n, k) x^k
可以分治NTT或FFT求出,复杂度 O ( n l o g n 2 ) O(nlogn^2)

第二类斯特林数

n n 个不同球放入 m m 个相同盒子的方案数即为 S ( n , m ) S(n,m)

递推

仍然分类讨论
新加入的球可以新开一个盒子,即为 S ( n 1 , m 1 ) S(n-1,m-1)
或者在之前任选一个盒子放入,即为 m S ( n 1 , m 1 ) m*S(n-1,m-1)
综上所述,有
S ( n , m ) = S ( n 1 , m 1 ) + m S ( n 1 , m 1 ) S(n,m)=S(n-1,m-1)+m*S(n-1,m-1)
复杂度 O ( n 2 ) O(n^2)

容斥原理

我们可以枚举至少有多少个盒子是空的,剩下的盒子随便放
那么有
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
再推一下会有
= 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
= 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)!}
容易发现,这是一个卷积形式,组合数和次幂都可以预处理
于是可以通过FFT或者NTT求出 S ( n , 0 ) , S ( n , 1 ) . . . S(n,0),S(n,1)...
复杂度 O ( n l o g n ) 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
等式左边即为 k k 个不同小球放入 n n 个不同盒子的方案数
我们可以通过枚举放入了多少个盒子,即为 S ( k , i ) i ! S(k,i)*i! ,由于第二类斯特林数中盒子是相同的所以我们需要乘一个 i ! i!
再在 n n 个盒子中选出 i i 个可知等式合法

猜你喜欢

转载自blog.csdn.net/Rose_max/article/details/85472358