#include <bits/stdc++.h>
using namespace std;
const int N = 50 + 10, mod = 1e9 + 7;
int n, k, dp[N][N][2], fact[N], factRev[N], inv2 = 5e8 + 4;
int sum(int a, int b) { return (1LL * a + b) % mod; }
int mul(int a, int b) { return 1LL * a * b % mod; }
int pw(int a, int b) {
  int res = 1, tmp = a;
  while (b) {
    if (b & 1) res = mul(res, tmp);
    tmp = mul(tmp, tmp);
    b >>= 1;
  }
  return res;
}
int divide(int a, int b) { return mul(a, pw(b, mod - 2)); }
int c(int a, int b) { return mul(fact[a], mul(factRev[b], factRev[a - b])); }
void prepros() {
  fact[0] = 1;
  for (int i = 1; i <= n; i++) fact[i] = mul(fact[i - 1], i);
  factRev[n] = pw(fact[n], mod - 2);
  for (int i = n - 1; ~i; i--) factRev[i] = mul(factRev[i + 1], i + 1);
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> k;
  if (2 * k > n) return cout << "0\n", 0;
  prepros();
  dp[1][0][0] = 1;
  for (int i = 2; i <= n; i++)
    for (int j = 1; j <= k; j++) {
      dp[i][j][0] = mul(dp[i - 1][j][1], i - 1);
      for (int ii = 1; ii < i - 1; ii++)
        for (int jj = 0; jj <= j; jj++) {
          int iii = i - 1 - ii, jjj = j - jj,
              tmp = mul(dp[ii][jj][1], dp[iii][jjj][1]);
          tmp = mul(tmp, c(i - 1, ii));
          tmp = mul(tmp, mul(ii, iii));
          tmp = mul(tmp, inv2);
          dp[i][j][0] = sum(dp[i][j][0], tmp);
        }
      for (int ii = 1; ii < i - 1; ii++)
        for (int jj = 0; jj < j; jj++) {
          for (int l = 0; l <= 1; l++) {
            int iii = i - 1 - ii, jjj = j - jj - 1,
                tmp = mul(dp[ii][jj][0], dp[iii][jjj][l]);
            tmp = mul(tmp, c(i - 1, ii));
            tmp = mul(tmp, mul(ii, iii));
            if (!l) tmp = mul(tmp, inv2);
            dp[i][j][1] = sum(dp[i][j][1], tmp);
          }
        }
      dp[i][j][1] = sum(dp[i][j][1], mul(dp[i - 1][j - 1][0], i - 1));
    }
  return cout << sum(dp[n][k][0], dp[n][k][1]) << "\n", 0;
}
