#include<iostream>
#include<cstdio>
#include<cstring>

namespace Cao
{
	typedef long long ll;
	const int N=52,MOD=1000000007;
	ll inv(int x){return x==1?1:(-(MOD/x)*inv(MOD%x)%MOD);}
	inline void inc(int a,int &b){b=(a+b)%MOD;}
	inline int abs(int x){return x<0?-x:x;}

	int fact[N],ifact[N];
	int *f[N],t0[N*N*2];

	int n;

	void dp()
	{
		f[1][0]=f[1][-1]=1;
		for(int i=1;i<n;i++)
			for(int j=-n;j<=n;j++)
			{
				int v=f[i][j];
				if(!v)continue;

				for(int a=0;i+a<=n;a++)
					for(int b=0;i+a+b<=n;b++)
					{
						if(abs(j)>abs(a+b) || a+b==0)continue;

						int k=j+a-b;

						if(k&1)continue;
						inc((ll)v*ifact[a]%MOD*ifact[b]%MOD,f[i+a+b][k/2]);
					}
			}
	}
	void solve()
	{
		for(int i=0;i<N;i++)f[i]=t0+(i-1)*N*2+N;
		fact[0]=1;
		for(int i=1;i<N;i++)fact[i]=(ll)fact[i-1]*i%MOD;
		ifact[N-1]=(inv(fact[N-1])+MOD)%MOD;
		for(int i=N-1;i;i--)ifact[i-1]=(ll)ifact[i]*i%MOD;

		scanf("%d",&n);
		dp();
		printf("%lld\n",(ll)f[n][0]*fact[n]%MOD);
	}
}

int main()
{
	Cao::solve();
	return 0;
}
