#include <bits/stdc++.h>
using namespace std;
const int N = 53;
long long x, y, g, n, k, dp1[N][N], dp2[N][N], fac[N], two = 1000000007 / 2 + 1,
                                                       o, m;
long long xgcd(long long a, long long b, long long &x, long long &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  long long x1, y1, gcd = xgcd(b, a % b, x1, y1);
  x = y1;
  y = x1 - (long long)(a / b) * y1;
  return gcd;
}
long long entekhab(long long r, long long n) {
  if (r == 0) return 1;
  long long ans = 1;
  ans = fac[n];
  x = 1, y = 1, g = xgcd(fac[r], 1000000007, x, y);
  ans = (ans * ((x + 1000000007) % 1000000007)) % 1000000007;
  x = 1, y = 1, g = xgcd(fac[n - r], 1000000007, x, y);
  ans = ((ans * ((x + 1000000007) % 1000000007))) % 1000000007;
  return ans;
}
int main() {
  fac[0] = 1;
  for (long long i = 1; i < N; i++) fac[i] = (fac[i - 1] * i) % 1000000007;
  scanf("%d%d", &n, &k);
  ;
  dp2[1][0] = dp1[0][0] = 1;
  for (long long i = 2; i < n + 1; i++) {
    for (long long j = 1; j < i / 2 + 1; j++) {
      m = 0;
      for (long long l = 0; l < i; l++) {
        for (long long p = 0; p < j + 1; p++) {
          o = (((dp1[l][p] * entekhab(l, i - 1)) % 1000000007) * max(l, 1ll) %
               1000000007 * dp1[i - 1 - l][j - p] % 1000000007 *
               max(i - 1 - l, 1ll)) %
              1000000007;
          m = (m + o) % 1000000007;
        }
      }
      dp2[i][j] = (m * two) % 1000000007;
      m = 0;
      for (long long l = 0; l < i; l++) {
        for (long long p = 0; p < j; p++) {
          o = (((((dp2[l][p] * entekhab(l, i - 1) % 1000000007) *
                  (dp1[i - 1 - l][j - p - 1] * 2 + dp2[i - 1 - l][j - p - 1])) %
                 1000000007) *
                max(i - 1 - l, 1ll)) %
               1000000007) *
              max(l, 1ll);
          o %= 1000000007;
          m = (m + o) % 1000000007;
        }
      }
      dp1[i][j] = (m * two) % 1000000007;
    }
  }
  cout << (dp1[n][k] + dp2[n][k]) % 1000000007;
}
