#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int gi() {
  int w = 0;
  bool q = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') q = 0, c = getchar();
  while (c >= '0' && c <= '9') w = w * 10 + c - '0', c = getchar();
  return q ? w : -w;
}
const int mod = 1e9 + 7;
int f[N][N], g[N][N];
int inv[N];
inline void inc(int &x, int y) { (x += y) >= mod ? x -= mod : 0; }
inline int C(int n, int m) {
  n += m - 1;
  int ans = 1;
  for (int i = 1; i <= m; i++)
    ans = 1LL * ans * (n - i + 1) % mod * inv[i] % mod;
  return ans;
}
int main() {
  int n = gi(), m = gi(), i, j, k, t, s, lim = n + 1;
  for (inv[0] = inv[1] = 1, i = 2; i < N; i++)
    inv[i] = mod - 1LL * (mod / i) * inv[mod % i] % mod;
  f[0][1] = 1;
  for (i = 0; i <= n; i++)
    for (j = 0; j <= lim; j++) {
      if (f[i][j])
        for (k = 0; k <= i && k + i <= n; k++)
          for (t = 0; t <= lim; t++) {
            if (k == i)
              if (t < j)
                inc(g[i + k + 1][t], 2LL * f[i][j] * f[k][t] % mod);
              else if (t == j)
                inc(g[i + k + 1][j], 1LL * f[i][j] * f[k][t] % mod);
              else
                break;
            else
              inc(g[i + k + 1][min(j, t)], 2LL * f[i][j] * f[k][t] % mod);
          }
      if (g[i][j])
        for (k = n - i; k >= 0; k--)
          for (t = lim - j; t >= 0; t--)
            if (f[k][t])
              for (s = min((n - k) / i, (lim - t) / j); s; s--)
                inc(f[k + i * s][t + j * s],
                    1LL * f[k][t] * C(g[i][j], s) % mod);
    }
  printf("%d\n", f[n][m]);
  return 0;
}
