/*
    求一棵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;
}