#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1e9 + 1;
const long double EPS = 1e-9;
const int MOD = (int)1e9 + 7;
void add(int &x, int y) {
  if ((x += y) >= MOD) {
    x -= MOD;
  }
}
int mult(int x, int y) { return (long long)x * y % MOD; }
const int maxn = 50 + 5;
int C[maxn][maxn];
void precalc() {
  memset(C, 0, sizeof(C));
  for (int n = 0; n < maxn; ++n) {
    C[n][0] = C[n][n] = 1;
    for (int k = 1; k < n; ++k) {
      C[n][k] = C[n - 1][k - 1];
      add(C[n][k], C[n - 1][k]);
    }
  }
}
int n, k;
bool read() {
  if (scanf("%d%d", &n, &k) < 2) {
    return 0;
  }
  return 1;
}
int d[maxn][maxn][2];
void countd(int mn, int mk) {
  for (int n = 1; n <= mn; ++n) {
    for (int k = 0; k <= mk; ++k) {
      for (int more = 0; more < 2; ++more) {
        int &cur = d[n][k][more];
        cur = 0;
        if (more && !k) {
          continue;
        }
        if (n == 1) {
          cur = (k == 0);
          continue;
        }
      }
      if (n == 1 || n < 2 * k) {
        continue;
      }
      add(d[n][k][0], mult(n - 1, d[n - 1][k][1]));
      add(d[n][k][1], mult(n - 1, d[n - 1][k - 1][0]));
      if (n >= 3) {
        for (int more = 0; more < 2; ++more) {
          for (int lk = 0; lk <= k - more; ++lk) {
            int rk = k - more - lk;
            for (int lmore = 0; lmore < 2; ++lmore) {
              for (int rmore = 0; rmore < 2; ++rmore) {
                if (more != (!lmore || !rmore)) {
                  continue;
                }
                for (int ln = 1; ln <= n - 2; ++ln) {
                  int rn = n - 1 - ln;
                  if (0 && mult(d[ln][lk][lmore], d[rn][rk][rmore])) {
                    fprintf(
                        stderr, "{%d,%d,%d}  {%d,%d,%d}  [%d] += %d\n", ln, lk,
                        lmore, rn, rk, rmore, more,
                        mult((n - 1) * (n - 2) / 2,
                             mult(C[n - 3][ln - 1],
                                  mult(d[ln][lk][lmore], d[rn][rk][rmore]))));
                  }
                  add(d[n][k][more],
                      mult((n - 1) * (n - 2) / 2,
                           mult(C[n - 3][ln - 1],
                                mult(d[ln][lk][lmore], d[rn][rk][rmore]))));
                }
              }
            }
          }
        }
      }
    }
  }
}
void solve() {
  countd(n, k);
  int res = 0;
  add(res, d[n][k][0]);
  add(res, d[n][k][1]);
  printf("%d\n", res);
}
int main() {
  srand(rdtsc());
  precalc();
  while (1) {
    if (!read()) {
      break;
    }
    solve();
  }
  return 0;
}

### Prompt

In CPP, your task is to solve the following problem:

Ksenia has her winter exams. Today she is learning combinatorics. Here's one of the problems she needs to learn to solve.

How many distinct trees are there consisting of n vertices, each with the following properties:

  * the tree is marked, that is, the vertices of the tree are numbered from 1 to n; 
  * each vertex of the tree is connected with at most three other vertices, and at the same moment the vertex with number 1 is connected with at most two other vertices; 
  * the size of the tree's maximum matching equals k. 



Two trees are considered distinct if there are such two vertices u and v, that in one tree they are connected by an edge and in the other tree they are not.

Help Ksenia solve the problem for the given n and k. As the answer to the problem can be very huge you should output it modulo 1000000007 (109 + 7).

Input

The first line contains two integers n, k (1 ≤ n, k ≤ 50).

Output

Print a single integer — the answer to the problem modulo 1000000007 (109 + 7).

Examples

Input

1 1


Output

0


Input

2 1


Output

1


Input

3 1


Output

3


Input

4 2


Output

12

Note

If you aren't familiar with matchings, please, read the following link: http://en.wikipedia.org/wiki/Matching_(graph_theory).

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1e9 + 1;
const long double EPS = 1e-9;
const int MOD = (int)1e9 + 7;
void add(int &x, int y) {
  if ((x += y) >= MOD) {
    x -= MOD;
  }
}
int mult(int x, int y) { return (long long)x * y % MOD; }
const int maxn = 50 + 5;
int C[maxn][maxn];
void precalc() {
  memset(C, 0, sizeof(C));
  for (int n = 0; n < maxn; ++n) {
    C[n][0] = C[n][n] = 1;
    for (int k = 1; k < n; ++k) {
      C[n][k] = C[n - 1][k - 1];
      add(C[n][k], C[n - 1][k]);
    }
  }
}
int n, k;
bool read() {
  if (scanf("%d%d", &n, &k) < 2) {
    return 0;
  }
  return 1;
}
int d[maxn][maxn][2];
void countd(int mn, int mk) {
  for (int n = 1; n <= mn; ++n) {
    for (int k = 0; k <= mk; ++k) {
      for (int more = 0; more < 2; ++more) {
        int &cur = d[n][k][more];
        cur = 0;
        if (more && !k) {
          continue;
        }
        if (n == 1) {
          cur = (k == 0);
          continue;
        }
      }
      if (n == 1 || n < 2 * k) {
        continue;
      }
      add(d[n][k][0], mult(n - 1, d[n - 1][k][1]));
      add(d[n][k][1], mult(n - 1, d[n - 1][k - 1][0]));
      if (n >= 3) {
        for (int more = 0; more < 2; ++more) {
          for (int lk = 0; lk <= k - more; ++lk) {
            int rk = k - more - lk;
            for (int lmore = 0; lmore < 2; ++lmore) {
              for (int rmore = 0; rmore < 2; ++rmore) {
                if (more != (!lmore || !rmore)) {
                  continue;
                }
                for (int ln = 1; ln <= n - 2; ++ln) {
                  int rn = n - 1 - ln;
                  if (0 && mult(d[ln][lk][lmore], d[rn][rk][rmore])) {
                    fprintf(
                        stderr, "{%d,%d,%d}  {%d,%d,%d}  [%d] += %d\n", ln, lk,
                        lmore, rn, rk, rmore, more,
                        mult((n - 1) * (n - 2) / 2,
                             mult(C[n - 3][ln - 1],
                                  mult(d[ln][lk][lmore], d[rn][rk][rmore]))));
                  }
                  add(d[n][k][more],
                      mult((n - 1) * (n - 2) / 2,
                           mult(C[n - 3][ln - 1],
                                mult(d[ln][lk][lmore], d[rn][rk][rmore]))));
                }
              }
            }
          }
        }
      }
    }
  }
}
void solve() {
  countd(n, k);
  int res = 0;
  add(res, d[n][k][0]);
  add(res, d[n][k][1]);
  printf("%d\n", res);
}
int main() {
  srand(rdtsc());
  precalc();
  while (1) {
    if (!read()) {
      break;
    }
    solve();
  }
  return 0;
}

```