/*
求一棵n个节点树的方法数T[n] 子树不分顺序
容易想到拆分,枚举子树怎么组成,然后乘以方法数
如 5 = 1 + 2 + 2
由于子树不分顺序,所以枚举出来的相同规模的子树是一种有重集的组合 ,用公式C(n+m-1,m)
然后用乘法原理乘起来即可
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<queue>
using namespace std;
long long T[50];
int cnt[50] , n;
long long gcd(long long a, long long b)
{
return b?gcd(b,a%b):a;
}
long long C(long long n, long long m)
{
if(m > n - m ) m = n - m;
long long mul = 1 , div = 1;
for(int i = 0; i < m;i++)
{
mul *= (n-i);
div *= (i+1);
long long g = gcd(mul,div);
mul/=g , div /= g;
}
return mul / div;
}
void dfs(int start, int left)
{
if( left == 0 )
{
long long ans = 1;
for(int i = 1; i<=n ;i ++)
{
if(cnt[i] == 0)continue;
ans = ans * C(T[i] - 1 + cnt[i] , cnt[i]);//重集的组合
}
T[n] += ans;
return ;
}
if(start > left )return;
cnt[start]++;
dfs(start , left - start);
cnt[start]--;
dfs(start+1 , left);
}
void init()
{
T[1] = T[2] = 1;
for(n = 3; n <= 40 ; n++)
{
dfs(1,n-1);
}
}
int main() {
init();
while( ~scanf("%d",&n) )
printf("%I64d\n",T[n]);
return 0;
}