#include <bits/stdc++.h>
using namespace std;
const long long Maxn = 1010;
long long f[Maxn][11][Maxn], g[Maxn][Maxn];
long long n, K, Mod;
long long inv[Maxn];
void up(long long &x, long long y) { x = (x + y) % Mod; }
long long _min(long long x, long long y) { return x < y ? x : y; }
int main() {
  long long i, j, k;
  scanf("%I64d%I64d%I64d", &n, &K, &Mod);
  if (n <= 2) {
    printf("1\n");
    return 0;
  }
  f[1][K - 1][0] = f[1][0][0] = 1;
  inv[0] = inv[1] = 1;
  for (i = 2; i <= n; i++) inv[i] = inv[Mod % i] * (Mod - Mod / i) % Mod;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= K; j++) {
      for (k = 1; k < i; k++) {
        up(f[i][j][k], f[i][j][k - 1]);
        for (long long x = 1; x <= j && x * k < i; x++)
          up(f[i][j][k],
             f[i - x * k][j - x][_min(k - 1, i - x * k - 1)] * g[k][x]);
      }
    }
    g[i][0] = 1;
    for (j = 1; i * j <= n; j++) {
      g[i][j] = g[i][j - 1] * (f[i][K - 1][i - 1] + j - 1) % Mod * inv[j] % Mod;
    }
  }
  long long ans = f[n][K][(n - 1) / 2];
  if (!(n & 1))
    up(ans, f[n / 2][K - 1][n / 2 - 1] * (f[n / 2][K - 1][n / 2 - 1] + 1) %
                Mod * inv[2]);
  printf("%I64d\n", ans);
  return 0;
}
