#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;   }   