第一次应用Stirling,并没有看出来
不过看了题解后,直呼太妙
Analysis
题意:n行诗存在的韵律组合数。
思路:第二类Stirling数是把n个元素放入k个等价类的方法数目(每个等价类都不能为空)。
注意到此题的'行数'>='韵律数',可以把'行数'抽象为n个元素,'韵律数'抽象为k个等价类.
所求即为:把n行放入k个‘韵律’中的方法数( 其中:1=< k <=n )。
然后就直接板子了
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
using namespace std;
int n;
double res=0,S2[105][105];
void pre_work(){
for(re int i=1;i<=100;++i){
S2[i][1]=S2[i][i]=1;
for(re int j=2;j<i;++j){
S2[i][j]=S2[i-1][j-1]+S2[i-1][j]*j;
}
}
}
int main(){
pre_work();
while(1){
scanf("%d",&n);
if(!n) return 0;
res=0;
for(re int i=1;i<=n;++i)
res+=S2[n][i];
printf("%d %.0lf\n",n,res);
}
return 0;
}