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個元素的集合可以劃分為多...