Problem:
Score : 1600 points

Problem Statement

Let X = 10^{100}. Inaba has N checker pieces on the number line, where the i-th checker piece is at coordinate X^{i} for all 1 \leq i \leq N.

Every second, Inaba chooses two checker pieces, A and B, and move A to the symmetric point of its current position with respect to B. After that, B is removed. (It is possible that A and B occupy the same position, and it is also possible for A to occupy the same position as another checker piece after the move).

After N - 1 seconds, only one checker piece will remain. Find the number of distinct possible positions of that checker piece, modulo 10^{9} + 7.

Constraints

1 \leq N \leq 50

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of distinct possible positions of the final checker piece, modulo 10^{9} + 7.

Sample Input 1

3

Sample Output 1

12

There are 3 checker pieces, positioned at 10^{100}, 10^{200}, 10^{300} respectively. Call them A, B, C respectively.

Here are two (of the 12) possible sequence of moves :

Let A jump over B in the first second, and let A jump over C in the second second. The final position of A is 2 \times 10^{300} - 2 \times 10^{200} + 10^{100}.

Let C jump over A in the first second, and let B jump over C in the second second. The final position of B is -2 \times 10^{300} - 10^{200} + 4 \times 10^{100}.

There are a total of 3 \times 2 \times 2 = 12 possible sequence of moves, and the final piece are in different positions in all of them.

Sample Input 2

4

Sample Output 2

84

Sample Input 3

22

Sample Output 3

487772376

Remember to output your answer modulo 10^{9} + 7.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
 
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<ll>::iterator sit;
typedef map<ll,ll>::iterator mit;
 
const int MOD = 1e9 + 7;
 
void add(int &a, int b)
{
	a+=b;
	while(a>=MOD) a-=MOD;
}
 
int mult(int a, int b)
{
	return (a*1LL*b)%MOD;
}
 
int modpow(int a, int b)
{
	int r=1;
	while(b)
	{
		if(b&1) r=mult(r,a);
		a=mult(a,a);
		b>>=1;
	}
	return r;
}
 
const int N = 105;
 
int fact[N+2];
int dp[N+2][2*N+2];
int ifact[N+2];
int n; 
 
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	fact[0]=1;
	for(int i=1;i<N;i++) fact[i]=mult(fact[i-1],i);
	for(int i=0;i<N;i++) ifact[i]=modpow(fact[i],MOD-2);
	cin>>n;
	dp[1][N] = dp[1][N-1] = 1;
	for(int i=1;i<=n;i++)
	{
		for(int k=0;k<=2*N+1;k++)
		{
			int v=dp[i][k];
			if(v==0) continue;
			for(int a=0;a+i<=n;a++) //# of positive
			{
				for(int b=0;b+a+i<=n;b++) //# of negative
				{
					if(a+b==0) continue;
					int V = mult(mult(v,ifact[a]),ifact[b]);
					int req = N - k;
					if(abs(a+b)>=abs(req)&&abs(a+b-req)%2==0)
					{
						add(dp[i+a+b][((a-b+k-N)>>1)+N], V);
					}
				}
			}
		}
	}
	int ans = mult(dp[n][N], fact[n]);
	cout<<ans<<'\n';
}