func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   const int MAXN = 50 + 10;   template <typename T>   inline void add(T& a, T b) {     a += b;     if (a >= MOD) a -= MOD;   }   int main() {     static long long g[MAXN][MAXN];     static long long f[MAXN][MAXN];     static long long F[MAXN][MAXN];     static long long inv[MAXN];     ios::sync_with_stdio(0);     int n, m;     cin >> n >> m;     inv[0] = inv[1] = 1;     for (int i = 2; i <= n; ++i) inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;     f[0][1] = 1;     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= i + 1; ++j) {         for (int p = 0; p <= i - 1; ++p) {           for (int q = j; q <= p + 1; ++q)             add(g[i][j], f[p][q] * f[i - 1 - p][j] % MOD);           for (int q = j + 1; q <= i - p; ++q)             add(g[i][j], f[p][j] * f[i - 1 - p][q] % MOD);         }         memset(F, 0, sizeof(F));         for (int k = 0; k <= n; ++k) {           for (int p = 1; p <= k + 1; ++p) {             long long c = 1;             for (int q = 1; k + q * i <= n; ++q) {               c = c * (g[i][j] + q - 1) % MOD * inv[q] % MOD;               add(F[k + q * i][p + q * j], f[k][p] * c % MOD);             }           }         }         for (int k = 0; k <= n; ++k)           for (int p = 1; p <= k + 1; ++p) add(f[k][p], F[k][p]);       }     }     cout << f[n][m] << endl;   }   