集合劃分問題(貝爾數)

2021-07-11 12:45:29 字數 1907 閱讀 4290

time limit:1000msmemory limit:32768kb64bit io format:%i64d & %i64u

submit

status

description

n個元素的集合可以劃分若干個非空子集。例如,當n=4時,集合可以劃分為15個不同的非空子集如下:

,,,},

,,},

,,},

,,},

,,},

,,},

,,},

,},,},

,},,},

,},,},

,},}

給定正整數n(1<=n<=20),計算出n個元素的集合 可以化為多少個不同的非空子集。

input

多組輸入資料,每組資料1行,表示元素個數n.

output

對於每組資料,輸出一行乙個數,表示不同的非空子集的個數。

sample input

24

sample output

215

解題思路(from internet):

設n個元素的集合可以劃分為f(n,m)個不同的由m個非空子集

組成的集合。

考慮3個元素的集合,可劃分為

① 1個子集的集合:}

② 2個子集的集合:,},,},,}

③ 3個子集的集合:,,}

∴f(3,1)=1;f(3,2)=3;f(3,3)=1;

如果要求f(4,2)該怎麼辦呢?

a.往①裡添乙個元素,得到,}

b.往②裡的任意乙個子集添乙個4,得到

,},,},

,},,},

,},,}

∴f(4,2)=f(3,1)+2*f(3,2)=1+2*3=7

推廣,得f(n,m)=f(n-1,m-1)+m*f(n-1,m)

後來發現這就是組合數學裡面的貝爾數。

bell數的定義:第n個bell數表示集合的劃分方案數,即:b[0] = 1;

每乙個bell數都是第二類stirling數的和,即:

第二類stirling數的意義是:s(n,k)表示將n個物體劃分成k個非空的不可辨別的(可以理解為盒子沒有編號)集合的方法

數。很明顯,每乙個bell是對應的第二類stirling數之和。

bell數的指數生成函式是:

注意本題要用long long型。

/*

* 檔名稱:number.cpp

* 作 者:單昕昕

* 完成日期:2023年4月29日

* 版 本 號:v1.0

*/#include#include#include#include#includeusing namespace std;

long long s(long long m,long long n)

int main()

{ long long n,i;

while(cin>>n)

{long long sum=0;

for(i=1; i<=n; i++)

sum+=s(i,n);

cout<

集合劃分問題

集合劃分問題 問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 不同的非空子集如下 其中,集合 由 1 個子集組成 集合 由2 子集組成 集合,由3子集組 成 集合,由4 子集組成。程式設計任務 給定正整數n 和m,計算出n元素的集合可以劃分為多少 不同的由...

集合劃分問題

問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 給定正整數n,計算出n個元素的集合可以劃分為多少個不同的非空子集。所求的是bell 數 滿足遞推公式 b n 所以這道題實際求第二類stirling數 s n,m 解決思想 1.若 m 1...

集合劃分問題I

time limit 1000ms memory limit 32768k total submit 174accepted 64問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 演算法設計 給定正整數n,計算出n個元素的集合可以劃分為多...