func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1E3 + 5, M = 11;   int n, d;   long long dp[N][M][N], inv[M] = {1}, ans, mo;   inline void upd(long long &x, long long y) {     x += y;     if (x >= mo) x -= mo;   }   long long Pow(long long a, int b = mo - 2) {     long long res = 1;     for (; b; b >>= 1, a = a * a % mo)       if (b & 1) res = res * a % mo;     return res;   }   long long C(int n, int m) {     long long res = inv[m];     for (int i = n - m + 1; i <= n; ++i) res = res * i % mo;     return res;   }   long long f(int i, int j, int k) {     if (dp[i][j][k] != -1) return dp[i][j][k];     if (i == 1) return dp[i][j][k] = !j || j == d - 1;     if (i > j * k + 1) return 0;     long long res = f(i, j, k - 1);     for (int t = 1; t * k < i && t <= j; ++t)       upd(res,           f(i - t * k, j - t, k - 1) * C(f(k, d - 1, k - 1) + t - 1, t) % mo);     return dp[i][j][k] = res;   }   int main() {     scanf( %d%d%lld , &n, &d, &mo);     if (n == 1) return 0 * printf( 1 n );     if ((n - 2) % (d - 1)) return 0 * printf( 0 n );     memset(dp, -1, sizeof dp);     for (long long i = 1, j = 1; i <= d; ++i) {       j = j * i % mo;       inv[i] = Pow(j);     }     ans = f(n, d, n >> 1);     if (n & 1)       ;     else       ans -= C(f(n / 2, d - 1, n / 2 - 1), 2);     printf( %lld n , (ans % mo + mo) % mo);     return 0;   }   