您的位置:首页 > 其它

集合划分问题(斯特林数模板)

2016-04-29 13:38 441 查看
Description

n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集如下:

{{1},{2},{3},{4}},

{{1,2},{3},{4}},

{{1,3},{2},{4}},

{{1,4},{2},{3}},

{{2,3},{1},{4}},

{{2,4},{1},{3}},

{{3,4},{1},{2}},

{{1,2},{3,4}},

{{1,3},{2,4}},

{{1,4},{2,3}},

{{1,2,3},{4}},

{{1,2,4},{3}},

{{1,3,4},{2}},

{{2,3,4},{1}},

{{1,2,3,4}}

给定正整数n(1<=n<=20),计算出n个元素的集合{1,2,…,n} 可以化为多少个不同的非空子集。

Input

多组输入数据,每组数据1行,表示元素个数n.

Output

对于每组数据,输出一行一个数,表示不同的非空子集的个数。

Sample Input

2

4

Sample Output

2

15

s(n,m)=s(n-1,m-1),m*s(n-1,m)

#include <iostream>
#include <string.h>
#include<cstdio>
using namespace std;
const int N=101;
long long s

;

void init()
{
memset(s,0,sizeof(s));
s[1][1]=1;
for(int i=2; i<N; i++)
{
for(int j=1; j<=i; j++)
{
s[i][j]=(s[i-1][j-1]+j*s[i-1][j]);
}
}
}
int main()
{
init();
int n;
long long sum;
while(~scanf("%d",&n))
{
sum=0;
for(int i=1;i<=n;++i)
sum+=s
[i];
printf("%I64d\n",sum);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: