int n;
unsigned long long a[550<<1];
int main(){
n=read();
a[0]=1; a[1]=1;
for(rint i=2;i<=n+n;i++) a[i]=1ull*a[i-1]*i;
unsigned long long ans=a[n+n]/a[n]/a[n]/(n+1);
cout<<ans<<endl;
return 0;
}
//不加高精
int n,m;
int f[51][51];
int main(){
n=read();m=read();
memset(f,0,sizeof(f));
for(rint i=1;i<=n;i++) f[i][1]=1;
for(rint j=2;j<=m;j++)
for(rint i=1;i<=n;i++)
f[i][j]=f[i-1][j-1]+j*f[i-1][j];
cout<<f[n][m];
return 0;
}
//使用高精
int n,m;
long long f[51][51][1010]={0};
inline void update(int u,int v){
for(rint i=1;i<=max(f[u-1][v-1][0],f[u-1][v][0]);i++)
f[u][v][i]+=f[u-1][v-1][i]+f[u-1][v][i]*v;
f[u][v][0]=max(f[u-1][v][0],f[u-1][v-1][0]);
for(rint i=1;i<=f[u][v][0];i++)
f[u][v][i+1]+=f[u][v][i]/10,
f[u][v][i]=f[u][v][i]%10;
while(f[u][v][f[u][v][0]+1]){
f[u][v][0]++;
f[u][v][f[u][v][0]+1]+=f[u][v][f[u][v][0]]/10;
f[u][v][f[u][v][0]]%=10;
}
}
int main(){
n=read();m=read();
memset(f,0,sizeof(f));
f[1][1][0]=1;f[1][1][1]=1;
for(rint i=2;i<=n;i++)
for(rint j=1;j<=i;j++)
update(i,j);
if(f[n][m][0]==0){
printf("0\n");
return 0;
}
for(rint i=f[n][m][0];i>=1;i--)
cout<<f[n][m][i];
cout<<endl;
return 0;
}
//矩陣乘法
struct matrix{ long long m[5][5];}a,b,ans;
long long n;
const int md=1e9+7;
inline matrix mul(matrix a,matrix b){
matrix ans;
for(rint i=1;i<=2;i++)
for(rint j=1;j<=2;j++){
ans.m[i][j]=0;
for(rint k=1;k<=2;k++)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%md;
}
return ans;
}
inline matrix matpow(matrix a,long long b){
matrix ans=a;b--;
while(b){
if(b&1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main(){
cin>>n;
if(n<=2){ printf("1\n");return 0;}
a.m[1][1]=1;a.m[2][1]=1;a.m[1][2]=0;a.m[2][2]=0;
b.m[1][1]=1;b.m[1][2]=1;b.m[2][1]=1;b.m[2][2]=0;
b=matpow(b,n-1);
ans=mul(a,b);
cout<<ans.m[2][1]<<endl;//輸出的是下面的f(n) 上面的是f(n+1)
return 0;
}