#include <bits/stdc++.h>
using namespace std;
int dp[52][52][3];
int cmemo[52][52];
void init() {
  memset(cmemo, 0, sizeof(cmemo));
  cmemo[0][0] = 1;
  for (int n = (1); n <= (52 - 1); ++n) {
    cmemo[n][0] = 1;
    for (int k = (1); k <= (n); ++k) {
      cmemo[n][k] = (1ll * cmemo[n - 1][k] + cmemo[n - 1][k - 1]) % 1000000007;
      assert(cmemo[n][k] > 0);
    }
  }
}
int choose(int n, int k) {
  if (k > n) return 0;
  if (n < 0) return 0;
  if (k < 0) return 0;
  return cmemo[n][k];
}
int main() {
  init();
  int N, K;
  cin >> N >> K;
  memset(dp, 0, sizeof(dp));
  dp[0][0][0] = 0;
  dp[0][0][1] = 1;
  dp[1][0][0] = 1;
  dp[1][0][1] = 0;
  for (int n = (2); n <= (N); ++n) {
    for (int k = (1); k <= (n / 2); ++k) {
      for (int g = (0); g <= (1); ++g) {
        int& ans = dp[n][k][g];
        ans = 0;
        for (int n1 = n - 1, n2 = 0; n1 >= n2; --n1, ++n2) {
          int temp = 0;
          int low = min(n1 / 2, k);
          for (int k1 = (0); k1 <= (low); ++k1) {
            int k2 = (g == 0) ? (k - k1) : (k - k1 - 1);
            if (k2 < 0) continue;
            if (k1 < 0) continue;
            if (g == 0) {
              if (k1 + k2 > k) continue;
              temp = (1ll * temp +
                      1ll * dp[n1][k1][1] * dp[n2][k2][1] % 1000000007) %
                     1000000007;
            } else {
              assert(g == 1);
              if (k1 + k2 + 1 > k) continue;
              temp = (1ll * temp +
                      1ll * dp[n1][k1][0] * dp[n2][k2][1] % 1000000007 +
                      1ll * dp[n1][k1][1] * dp[n2][k2][0] % 1000000007 +
                      1ll * dp[n1][k1][0] * dp[n2][k2][0] % 1000000007) %
                     1000000007;
            }
          }
          temp = 1ll * temp * choose(n - 1 - (n1 == n2), n1 - (n1 == n2)) %
                 1000000007 * max(n1, 1) % 1000000007 * max(n2, 1) % 1000000007;
          ans = (1ll * ans + temp) % 1000000007;
        }
      }
    }
  }
  cout << (1ll * dp[N][K][1] + dp[N][K][0]) % 1000000007 << endl;
}
