#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
const int maxD = 12;
int mod;
inline int ad(int x, int y) { return x >= mod - y ? x - mod + y : x + y; }
inline int re(int x, int y) { return x < y ? x - y + mod : x - y; }
inline int mu(int x, int y) { return (long long)x * y % mod; }
inline int qp(int x, long long y) {
  int r = 1;
  while (y) {
    if (y & 1) r = mu(r, x);
    x = mu(x, x);
    y >>= 1;
  }
  return r;
}
inline int iv(int x) { return qp(x, mod - 2); }
inline int dv(int x, int y) { return mu(x, qp(y, mod - 2)); }
int f[maxn][maxD][maxn];
int inv[maxD];
int C(int x, int l) {
  int ret = 1;
  for (int i = 1; i <= l; i++) ret = mu(ret, mu(inv[i], x)), x = re(x, 1);
  return ret;
}
int main() {
  int n, D;
  scanf("%d%d%d", &n, &D, &mod);
  if (n <= 2) {
    puts("1");
    return 0;
  }
  for (int i = 0; i <= n; i++) f[1][0][i] = 1;
  for (int i = 1; i <= D; i++) inv[i] = iv(i), f[i + 1][i][1] = 1;
  for (int k = 2; k < n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= D; j++) {
        f[i][j][k] = ad(f[i][j][k], f[i][j][k - 1]);
        for (int l = 1; l <= j && i > l * k; l++)
          f[i][j][k] = ad(f[i][j][k], mu(f[i - l * k][j - l][k - 1],
                                         C(f[k][D - 1][k - 1] + l - 1, l)));
      }
  printf("%d\n",
         re(f[n][D][n / 2], ((n & 1) ? 0 : C(f[n / 2][D - 1][n / 2], 2))));
  return 0;
}
