1. 程式人生 > >第一類&第二類斯特林數學習筆記

第一類&第二類斯特林數學習筆記

第一類斯特林數

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 !