#include <bits/stdc++.h>
using namespace std;
template <class T>
void r1(T &x) {
  x = 0;
  char c(getchar());
  int f(1);
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  x *= f;
}
const int maxn = 1000 + 5;
const int maxm = 25;
bool begin;
long long n, d, mod;
long long inv[maxm];
long long f[maxn][maxm][maxn >> 1];
bool end;
long long ksm(long long mi, long long x) {
  long long res(1);
  while (mi) {
    if (mi & 1) res = res * x % mod;
    mi >>= 1;
    x = x * x % mod;
  }
  return res;
}
long long C(long long a, long long b) {
  if (a < b) return 0;
  long long res(a);
  for (long long i = a - 1; i > a - b; --i) res = res * i % mod;
  return res * inv[b] % mod;
}
signed main() {
  long long i, j, k;
  r1(n), r1(d), r1(mod);
  if (n <= 2) return puts("1"), 0;
  inv[10] = ksm(mod - 2, 3628800 % mod);
  for (i = 9; i; --i) inv[i] = inv[i + 1] * (i + 1) % mod;
  for (i = 0; i <= (n >> 1); ++i) f[1][0][i] = 1;
  for (i = 2; i <= n; ++i) {
    for (j = 1; j <= min(d, i - 1); ++j) {
      for (k = 1; k <= (n / 2); ++k) {
        f[i][j][k] = f[i][j][k - 1];
        for (long long t = 1; i - t * k > 0 && j - t >= 0; ++t) {
          if (k == 1)
            f[i][j][k] = (f[i][j][k] + f[i - t * k][j - t][k - 1] *
                                           C(f[k][0][k - 1] + t - 1, t) % mod) %
                         mod;
          else
            f[i][j][k] =
                (f[i][j][k] + f[i - t * k][j - t][k - 1] *
                                  C(f[k][d - 1][k - 1] + t - 1, t) % mod) %
                mod;
        }
      }
    }
  }
  long long ans(0);
  if (n & 1)
    ans = f[n][d][n / 2];
  else {
    ans = f[n][d][n / 2] - C(f[n / 2][d - 1][n / 2 - 1], 2);
    ans = (ans + mod) % mod;
  }
  printf("%lld\n", ans);
  return 0;
}
