其实求的是BELL数,即前N个第二类斯特林数的和。
一首诗有n行,每一行有一种韵律,问这首诗总共可能有多少种韵律排列。如4行,则所有的15种情况为:aaaa, aaab, aaba, aabb, aabc, abaa, abab, abac, abba, abbb, abbc, abca, a bcb, abcc, and abcd
即每首诗可能只有一种,两种。。。N种韵律。对应第二类斯特林数,即是把N行诗放入K种韵律的盒子中。求和。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
double str[55][55];
void initial(){
for(int i=0;i<55;i++){
for(int j=0;j<=i;j++){
if(i==j) str[i][j]=1;
else if(j==0&&i>=1) str[i][j]=0;
else{
str[i][j]=j*str[i-1][j]+str[i-1][j-1];
}
}
}
}
int main(){
initial();
int n;
while(scanf("%d",&n),n){
double ans=0;
for(int i=0;i<=n;i++)
ans+=(str[n][i]);
printf("%d %0.lf\n",n,ans);
}
return 0;
}