Problem:
Score : 1200 points

Problem Statement

Find the number of the possible tuples of sequences (A_0,A_1,...,A_N) that satisfy all of the following conditions, modulo M:

For every i (0\leq i\leq N), A_i is a sequence of length i consisting of integers between 1 and K (inclusive);

For every i (1\leq i\leq N), A_{i-1} is a subsequence of A_i, that is, there exists 1\leq x_i\leq i such that the removal of the x_i-th element of A_i would result in a sequence equal to A_{i-1};

For every i (1\leq i\leq N), A_i is lexicographically larger than A_{i-1}.

Constraints

1 \leq N,K \leq 300

2 \leq M \leq 10^9

N, K and M are integers.

Input

Input is given from Standard Input in the following format:

N K M

Output

Print the number of the possible tuples of sequences (A_0,A_1,...,A_N), modulo M.

Sample Input 1

2 2 100

Sample Output 1

5

Five tuples below satisfy the conditions:

(),(1),(1,1)

(),(1),(1,2)

(),(1),(2,1)

(),(2),(2,1)

(),(2),(2,2)

Sample Input 2

4 3 999999999

Sample Output 2

358

Sample Input 3

150 150 998244353

Sample Output 3

186248260

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;

const int N = 305;

int md;

inline void add(int &x, int y) {
  x += y;
  if (x >= md) x -= md;
}

inline void sub(int &x, int y) {
  x -= y;
  if (x < 0) x += md;
}

inline int mul(int x, int y) {
  return 1ll * x * y % md;
}

inline int power(int b, int p) {
  int r = 1;
  while (p > 0) {
    if (p & 1) r = mul(r, b);
    b = mul(b, b);
    p >>= 1;
  }
  return r;
}

int dp[N][N];
int pref[N][N];
int ch[N][N];

void precalc() {
  for (int i = 0; i < N; i++) {
    for (int j = 0; j <= i; j++) {
      if (j == 0) {
        ch[i][j] = 1;
      } else {
        add(ch[i][j], ch[i - 1][j]);
        add(ch[i][j], ch[i - 1][j - 1]);
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k;
  cin >> n >> k >> md;
  precalc();
  for (int i = 0; i <= k; i++) dp[0][i] = 1;
  for (int i = 1; i <= n; i++) {
    pref[i - 1][0] = 0;
    for (int j = 1; j <= k; j++) {
      add(pref[i - 1][j], pref[i - 1][j - 1]);
      add(pref[i - 1][j], dp[i - 1][j - 1]);
      for (int r = 1; r <= i; r++) {
        add(dp[i][j], mul(ch[i - 1][r - 1], mul(pref[r - 1][j], dp[i - r][j])));
      }
    }
  }
  cout << dp[n][k] << '\n';
  return 0;
}