/*
#include<iostream>
using namespace std;
long n,f[20][20];//f数组记录方案
long dfs(int x,int y)//x是操作队列里元素的个数,y是栈里的个数
{
if(f[x][y]!=0) return f[x][y];//记忆化,走过的方案直接调用
if(x==0) return 1;//当操作队列里没有了,就只有一种方案了
if(y>0) f[x][y]+=dfs(x,y-1);//栈里不为空的时候才可以把栈里的元素推出
f[x][y]+=dfs(x-1,y+1);//操作队列里元素减一,栈里元素加一
return f[x][y];//返回方案值
}
int main()
{
cin>>n;
cout<<dfs(n,0)<<endl;
return 0;
}*/
/*
//This program is written by QiXingZhi
#include <cstdio>
int n, f[30];
int main()
{
//递推实现卡特兰数
scanf("%d", &n);
f[0] = 1, f[1] = 1;
for(int i=2; i<=n; i++)
for(int j=0; j<i; j++)
f[i] += f[j] * f[i-j-1]; //递推公式
printf("%d", f[n]);
return 0;
}*/
#include<iostream>
#include<cstdio>
#include<cstring>//为了NOIP不用万能头文件
using namespace std;
int f[20][20];//数据就给到18,开个20算大方的
int n;
int main()
{
memset(f,0,sizeof(f));
scanf("%d",&n);
for(int i=0;i<=n;i++)
f[i][0]=1;//边界一定要有
for(int j=1;j<=n;j++)//i依赖于j的状态
for(int i=0;i<=n;i++)
{
if(i>=1)
f[i][j]=f[i-1][j]+f[i+1][j-1];
if(i==0)//栈内没有东西
f[i][j]=f[i+1][j-1];
}
printf("%d",f[0][n]);
return 0;
}