func_code_string: #include <bits/stdc++.h>   using namespace std;   int F[60][60], f[60][60], g[60][60], h[60][60], dp[60][60], fac[60], inv[60],       mod = 1000000007;   int fpow(int a, int b) {     int ans = 1, t = a;     while (b) {       if (b & 1) ans = 1ll * ans * t % mod;       t = 1ll * t * t % mod;       b >>= 1;     }     return ans;   }   int calc(int n, int m, int a, int b) {     int ans = 0;     int cur = 1;     for (int i = 0; i * a <= n && i * b <= m; i++) {       ans = (ans + 1ll * dp[n - i * a][m - i * b] * cur % mod * inv[i]) % mod;       cur = 1ll * cur * (g[a][b] + i) % mod;     }     return ans;   }   int main() {     fac[0] = inv[0] = 1;     for (int i = 1; i <= 51; i++) {       fac[i] = 1ll * fac[i - 1] * i % mod;       inv[i] = fpow(fac[i], mod - 2);     }     int n, m;     scanf( %d%d , &n, &m);     f[0][1] = 1;     dp[0][0] = 1;     for (int i = 1; i <= n; i++) {       for (int j = n + 1; j >= 1; j--) {         F[i - 1][j] = (F[i - 1][j + 1] + f[i - 1][j]) % mod;       }       for (int j = n + 1; j >= 1; j--) {         h[i][j] = 0;         for (int k = 0; k < i; k++) {           h[i][j] = (h[i][j] + 1ll * F[k][j] * F[i - k - 1][j]) % mod;         }         g[i][j] = (h[i][j] - h[i][j + 1] + mod) % mod;       }       for (int j = 1; j <= n + 1; j++) {         for (int x = n; x >= 0; x--) {           for (int y = n + 1; y >= 0; y--) {             dp[x][y] = calc(x, y, i, j);           }         }       }       for (int j = 1; j <= n + 1; j++) {         f[i][j] = dp[i][j - 1];       }     }     printf( %d n , f[n][m]);     return 0;   }   