#include <bits/stdc++.h>
using namespace std;
const long long Mo = 1000000007LL;
long long f[60][60], g[60][60];
long long fac[70], inv[70];
int n, m;
void add(long long &a, long long b) {
  a += b;
  a %= Mo;
}
long long fpm(long long a, long long b) {
  long long ans = 1LL;
  for (; b; b >>= 1) {
    if (b & 1LL) ans *= a, ans %= Mo;
    a *= a;
    a %= Mo;
  }
  return ans;
}
long long C(long long a, long long b) {
  a += b - 1;
  a %= Mo;
  if (a < b) return 0LL;
  long long ans = 1LL;
  for (int i = a; i > a - b; i--) ans = ans * i % Mo;
  ans *= inv[b];
  return ans % Mo;
}
void solve() {
  f[2][1] = 1;
  for (int i = 1; i <= 52; i++) {
    for (int x = 2; x <= i + 1; x++) {
      int y = i + 3 - x;
      for (int a = 1; a <= x; a++)
        for (int b = 1; b <= y; b++) add(g[i][min(a, b)], f[x][a] * f[y][b]);
    }
    for (int x = 1; x <= i; x++)
      for (int j = 52; j >= 2; j--) {
        for (int k = 1; k * i + 2 <= j; k++) {
          for (int y = x * k; y <= j; y++)
            add(f[j][y], f[j - i * k][y - x * k] * C(g[i][x], k));
        }
      }
  }
}
int main() {
  fac[0] = 1;
  for (int i = 1; i <= 60; i++) fac[i] = (fac[i - 1] * (long long)i) % Mo;
  for (int i = 0; i <= 60; i++) inv[i] = fpm(fac[i], Mo - 2LL);
  scanf("%d %d", &n, &m);
  solve();
  cout << f[n + 2][m] << endl;
  return 0;
}
