1. 程式人生 > >Stiring數學習筆記

Stiring數學習筆記

第一類

在此僅討論無符號第一類Stiring數。

定義

n個有標號的球組成m個圓排列的方案數,即第一類斯特林數,記做 S 1 ( n , m )

S_1(n,m) ,亦記做 [ n m
] \begin{bmatrix}n\\ m\end{bmatrix}

遞推式

考慮最後一個元素,可以新組成一個圓排列,也可以插入之前 n 1

n-1 個元素的任意一個之後,不難得到其遞推式為

S 1 ( n , m ) = S 1 ( n 1 , m 1 ) + ( n 1 ) S 1 ( n 1 , m ) S_1(n,m)=S_1(n-1,m-1)+(n-1)S_1(n-1,m)

更快速的求法

第n行的生成函式為
i = 0 n 1 ( x + i ) = x n \prod_{i=0}^{n-1}(x+i)=x^{\overline n}

其中的第m項係數即為 S 1 ( n , m ) S_1(n,m)

為啥呢?我們不妨從遞推式進行思考,第n-1行到第n行,如果列數不增加,則要乘以當前的行數,如果列數增加1,就以1倍加入。

那麼我們用分治FFT就可以在 O ( n log 2 n ) O(n\log^2 n) 的複雜度求出某一行的值了。


然而其實還有更優秀的方法——倍增。

f ( x ) = x n , g ( x ) = ( x + n ) n = f ( x + n ) f(x)=x^{\overline n},g(x)=(x+n)^{\overline n}=f(x+n) ,則有 f ( x ) g ( x ) = x 2 n f(x)g(x)=x^{\overline{2n}}

那麼考慮倍增,我們希望能通過 f ( x ) f(x) ,快速的求出 g ( x ) g(x)

不妨設
f ( x ) = i = 0 n a i x i f(x)=\sum_{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 ) n i j x j g(x)=\sum_{i=0}^n a_i (x+n)^i=\sum_{i=0}^na_i\sum_{j=0}^i\binom i j n^{i-j}x^j
改變求和順序
g ( x ) = i = 0 n ( j = i n ( j i ) n j i a j ) x i g(x)=\sum_{i=0}^n\biggl(\sum_{j=i}^n \binom j i n^{j-i} a_j\biggr) x^i

把組合數一拆,卷積即可

時間複雜度為 T ( n ) = 2 T ( n 2 ) + O ( n log n ) = O ( n log n ) T(n)=2T(\frac n 2)+O(n\log n)=O(n\log n) ,常數略大,但相比分治FFT有較大優勢。

第二類

定義

n個有標號球放入m個無標號箱子,且每個箱子不為空的方案數,記做 S 2 ( n , m ) S_2(n,m) ,亦記做 \{ n m \} n\brace m

公式

同樣的,我們思考一下最後一個球新做一個箱子還是放入之前的箱子中去,不難得到:

S 2 ( n , m ) = S 2 ( n 1 , m 1 ) + m S 2 ( n 1 , m ) S_2(n,m)=S_2(n-1,m-1)+mS_2(n-1,m)


我們也可以用容斥來做

至少有 i i 個箱子為空的方案數
( m i ) ( m i ) n \binom m i (m-i)^n
容斥一下,再把箱子改為無標號的即得
S 2 ( n , m ) = 1 m ! i