#include <bits/stdc++.h>
using namespace std;
long long dp[55][55][2] = {};
long long C[105][105];
int n, kk;
int main() {
  srand((unsigned int)time(NULL));
  scanf("%d %d", &n, &kk);
  C[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= i; j++) {
      if (!j || j == i)
        C[i][j] = 1LL;
      else
        C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % 1000000007;
    }
  }
  dp[1][0][0] = 1ll;
  for (int i = 2; i <= n; i++) {
    for (int j = 0; j <= kk; j++) {
      dp[i][j][0] += (1LL * (i - 1) * dp[i - 1][j][1]) % 1000000007;
      if (j) dp[i][j][1] += (1LL * (i - 1) * dp[i - 1][j - 1][0]) % 1000000007;
      dp[i][j][0] %= 1000000007;
      dp[i][j][1] %= 1000000007;
      for (int k = 0; k <= i - 3; k++) {
        long long v = (1LL * C[i - 1][2] * C[i - 3][k]) % 1000000007;
        for (int m1 = 0; m1 <= j; m1++) {
          int m2 = j - m1;
          dp[i][j][0] +=
              (v * ((dp[k + 1][m1][1] * dp[i - 2 - k][m2][1]) % 1000000007)) %
              1000000007;
          dp[i][j][0] %= 1000000007;
          m2--;
          if (m2 < 0) continue;
          dp[i][j][1] +=
              (v * ((dp[k + 1][m1][1] * dp[i - 2 - k][m2][0]) % 1000000007)) %
              1000000007;
          dp[i][j][1] %= 1000000007;
          dp[i][j][1] +=
              (v * ((dp[k + 1][m1][0] * dp[i - 2 - k][m2][0]) % 1000000007)) %
              1000000007;
          dp[i][j][1] %= 1000000007;
          dp[i][j][1] +=
              (v * ((dp[k + 1][m1][0] * dp[i - 2 - k][m2][1]) % 1000000007)) %
              1000000007;
          dp[i][j][1] %= 1000000007;
        }
      }
    }
  }
  printf("%lld\n", (dp[n][kk][0] + dp[n][kk][1]) % 1000000007);
}
