poj1671(第二类Stirling数)

Rhyme Schemes
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 1871 Accepted: 1033 Special Judge

Description

The rhyme scheme for a poem (or stanza of a longer poem) tells which lines of the poem rhyme with which other lines. For example, a limerick such as If computers that you build are quantum 
Then spies of all factions will want 'em 
Our codes will all fail 
And they'll read our email 
`Til we've crypto that's quantum and daunt 'em 

Jennifer and Peter Shor (http://www.research.att.com/~shor/notapoet.html) 

Has a rhyme scheme of aabba, indicating that the first, second and fifth lines rhyme and the third and fourth lines rhyme. 
For a poem or stanza of four lines, there are 15 possible rhyme schemes: 
aaaa, aaab, aaba, aabb, aabc, abaa, abab, abac, abba, abbb, abbc, abca, a bcb, abcc, and abcd. 
Write a program to compute the number of rhyme schemes for a poem or stanza of N lines where N is an input value.

Input

Input will consist of a sequence of integers N, one per line, ending with a 0 (zero) to indicate the end of the data. N is the number of lines in a poem.

Output

For each input integer N, your program should output the value of N, followed by a space, followed by the number of rhyme schemes for a poem with N lines as a decimal integer with at least 12 correct significant digits (use double precision floating point for your computations).

Sample Input

1
2
3
4
20
30
10
0

Sample Output

1 1
2 2
3 5
4 15
20 51724158235372
30 846749014511809120000000
10 115975

/*
思路:第二类Stirling数。把行数p看做球数,a,b,c…等字母符号看作无标号的盒子,盒子数从1个到最多为p个
从第1行到第p行,在第k行新增一种字母则相当于把第k个放入新盒子,如果没有新增字母则相当于把它与之前某行
或某几行共占一个盒子 
 结果就是 Bell数 B(p)=S(p,0)+S(p,1)+.....+S(p,k) 此时k=p 
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
#define maxn 105 
double s[maxn][maxn];//存放要求的Stirling数  
double res[maxn];
void init()//预处理  
{  
    memset(s,0,sizeof(s)); 
	memset(res,0,sizeof(res)); 
    s[1][1]=1;  
    res[1]=1;
    for(int i=0;i<=maxn;++i){  
        s[i][0]=0;  
        s[i][i]=1;  
    } 
    for(int i=2;i<=maxn-1;i++)  
    {
        for(int j=1;j<=i;j++)  
    	{  
        	s[i][j]=s[i-1][j-1]+j*s[i-1][j];  
        	res[i]+=s[i][j];
    	}  
    }
} 
int main()
{
	init();
	int n;
	while(~scanf("%d",&n)&&n)
	{
		printf("%d %.0lf\n",n,res[n]);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值