#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;
}
