POJ1671 Rhyme Schemes
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 1776 | Accepted: 984 | 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.
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
Source
按照题目所说,double的精度就可以过
第二类Stirling数:将n个不同的元素分成m个集合的问题。
度娘百科:http://baike.baidu.com/link?url=Gf9ql9PnQNNjCZVUgI6SH_o1DgFwpL5yOFalDr_baNqKmrr0unKZvaDNU5RzSGmMQIbKW3Efivp0GPOlz3tcga
别人简洁的题解:http://blog.csdn.net/nvfumayx/article/details/12356847
1 /**/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 double f[110][110];//[元素数量][分组数量]=方法数 9 int n; 10 void init(){ 11 int i,j; 12 for(i=1;i<=100;i++) f[1][i]=0,f[i][1]=1; 13 for(i=2;i<=100;i++) 14 for(j=2;j<=i;j++){ 15 f[i][j]=f[i-1][j-1]+f[i-1][j]*j; 16 } 17 return; 18 } 19 int main(){ 20 init(); 21 while(scanf("%d",&n) && n){ 22 double ans=0; 23 for(int i=1;i<=n;i++)ans+=f[n][i]; 24 printf("%d %.0f\n",n,ans); 25 } 26 return 0; 27 }
本文为博主原创文章,转载请注明出处。