斯特林數是組合數學中的乙個重要內容,有許多有用的性質.它由十八世紀的蘇格蘭數學家james stirling首先發現並說明了它們的重要性.
斯特林數主要處理的是把n個不同的元素分成k個集合或環的個數問題.現在我們說的斯特林數可以指兩類數,分為第一類斯特林數和第二類斯特林數,其中第一類斯特林數還分成有符號和無符號兩種.
將 n 個不同的元素全部放入 m 個環中,不允許有空環出現,求方案數.定義:
\[s(i,j)
\]為 i 個人分成 j 組做環排列的方法數目.
對於每乙個s( i , j )我們考慮第 i 個物品,有兩種情況:
1. i 可以單獨構成乙個非空迴圈排列,這樣前 i-1 種物品構成 j-1 個非空迴圈排列,方法數為s(i-1,j-1);
2.也可以前 i-1 種物品構成 j 個非空迴圈排列,而第 i 個物品插入第 i 個物品的左邊,這有( i-1)*s( i-1 , j )種方法;
於是我們可以得到s(i,j)的遞推公式:
\[s(i,j)=(i-1)*s(i-1,j)+s( i-1 , j-1 ) ,1<=i<=j-1
\]邊界條件:$$s(i,0)=0 ,p>=1$$
$$ s(i,i)=1 ,p>=0$$
時間複雜度為 o(n^2).
將 n 個不同的元素全部放入 m 個集合中,不允許有空集出現,求方案數.定義:$$s(n,m)$$
為把n個元素劃分成m個無序集合的方案數.
根據這個定義我們不難寫出遞推式
設狀態s(i,j),對於第i個元素我們則有兩種情況:
1.若單獨乙個集合,則方案數等價於s(i-1,j-1).
2.若不是單獨乙個集合,則他可以在之前任意j個集合裡,方案為j x s(i-1,j)
於是可以得到遞推公式:
\[s(i,j)=s(i-1,j-1)+s(i-1,j)*j
\]邊界條件:$$s(p,p)=1,(p>=0)$$
$$s(p,0)=0,(p>0)$$
時間複雜度為 o(n^2).
假設集合沒有非空的限制,則答案顯然是m^n
之後我們可以利用容斥原理,列舉至少有幾個集合是空的,在套上容斥係數我們有(注意集合是無序的,所以最後要消序)
\[s(n,m)=\frac*\sum^_ (-1)^k*c_m^k)*(m-k)^n)
\]直接根據這個式子暴力求解某一行的斯特林數的複雜度是o(n^2)的
這是乙個卷積形式,利用fft我們可以將時間複雜度優化成o(nlogn).
然後這裡有一道 二類斯特林的裸題 .給出第二類斯特林數的遞推部分**,add 函式為高精度加法.(我不想打高精度,貼了別人的哈..)
void add(int u,int v)
}
組合數學 斯特林數
斯特林數包括第一類斯特林數和第二類斯特林數 第一類斯特林數 定義 n個不同的元素構成m個圓排列 迴圈排列 的方法數 分成兩種情況 1 前n 1個元素已經構成了m個圓排列,只要將第n個元素插入1 n 1個元素中任意乙個元素的左邊即可 n 1 s n 1,m 2 前n 1個元素已經構成了m 1個圓排列,...
組合數學之斯特林數 貝爾數
斯特林數經常和組合數學中的上公升下降問題聯絡到一起。第一類斯特林數 將n個不同的元素構成m個不同的環的方案數目 兩環不想等當且僅當任一不能通過旋轉得到另一環 dp i j 表示i個元素構成j個環 有兩種情況可以得到dp i j 1.前i 1個元素構成了j 1個不同的環,第i個元素單獨成環 共有 dp...
模板 數學 組合數學 第二類斯特林數
記 s n,m 表示,把 n 個不同的小球,放在 m 個相同的盒子裡,且每個盒子至少有 1 個球,的方法數。記 s n,m 表示,把 n 個不同的元素,劃分為 m 個非空集合的方法數。顯然 s 0,0 1 而 s n,0 當 n geq 1 時顯然是不合法的方案,s 0,m 當 m geq 1 時因...