蓝书p118
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 40
using namespace std;
typedef long long ll;
ll f[MAXN];
ll d[MAXN][MAXN];
ll C(ll n,ll m) {
double ret = 1;
for(int i = n;i > n-m;i--)
ret *= i;
for(int i = m;i >= 1;i--)
ret /= i;
return (ll)(ret+0.5);
}
int main() {
f[1] = 1;
memset(d,0,sizeof(d));
for(int i = 0;i <= 30;i++) d[i][0] = 1;
for(int i = 1;i <= 30;i++) {
d[i][1] = 1;
d[0][i] = 0;
}
int n = 30;
for(int i = 1;i <= n;i++)
for(int j = 2;j <= n;j++) {
d[i][j] = 0;
for(int p = 0;p*i <= j;p++) {
d[i][j] += C(f[i]+p-1,p) * d[i-1][j-p*i];
}
f[i+1] = d[i][i+1];
}
while(scanf("%d",&n) == 1 && n) {
printf("%lld\n",n==1?1:2*f[n]);
}
return 0;
}