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