#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int n, K, C[65][65], f[65][65][2];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline int add(int a, int b) { return (a += b) >= mod ? a - mod : a; }
inline int sub(int a, int b) { return (a -= b) < 0 ? a + mod : a; }
inline int mul(int a, int b) { return 1LL * a * b % mod; }
inline int fast(int a, int b) {
  int ret(1);
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1) ret = mul(ret, a);
  return ret;
}
void pre() {
  for (int i = 0; i <= 60; ++i) {
    C[i][0] = C[i][i] = 1;
    for (int j = 1; j < i; ++j) C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
  }
}
int main() {
  n = read();
  K = read();
  pre();
  f[0][0][1] = f[1][0][0] = 1;
  for (int i = 2; i <= n; ++i)
    for (int j = 1; j < i; ++j)
      for (int k = 0; k <= (j >> 1); ++k)
        for (int l = 0; l <= ((i - j - 1) >> 1); ++l)
          for (int x = 0; x <= 1; ++x)
            for (int y = 0; y <= 1; ++y) {
              int z = (!(x & y));
              if (k + l + z > K) continue;
              int temp = mul(C[i - 2][j - 1], i);
              f[i][k + l + z][z] =
                  add(f[i][k + l + z][z],
                      mul(mul(f[j][k][x], f[i - j - 1][l][y]), temp));
            }
  printf("%d\n", mul(add(f[n][K][0], f[n][K][1]), fast(n, mod - 2)));
  return 0;
}
