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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

#define pb push_back
#define all(v) v.begin(), v.end()
#define sz(v) int(v.size())
#define pii pair<int, int>
#define mp make_pair
#define f first
#define ll long long
#define ld long double
#define s second
#define vec vector<int>

using namespace std;

const int N = (int) 500 + 10;
const int M = (int) 1e6 + 10;
const int K = (int) 500 + 10;
const int INF = (int) 1e9 + 7;
//const int mod = (int) 1e9 + 7;
const ld EPS = (ld) 1e-9;
const ll LINF = (ll) 1e18;

int n, k, mod;
int c[N][N], dp[N][N], suff[N][N];

void add(int &x, int y) {
	x += y;
	if (x >= mod)
		x -= mod;
	if (x < 0)
		x += mod;
}

int mult(int x, int y) {
	return x * 1ll * y % mod;
}

int main() {
	#ifdef sony
		freopen("input.txt", "r", stdin);
		freopen("output1.txt", "w", stdout);
	#endif
	srand(time(0));
	cin >> n >> k >> mod;
	for (int i = 0; i <= n; i++) {
		c[i][0] = 1;
		for (int j = 1; j <= i; j++) {
			add(c[i][j] = c[i - 1][j], c[i - 1][j - 1]);
		}
	}
	cout << "Hello, World!\n";
	for (int cnt = 1; cnt <= n + 1; cnt++) {
		for (int x = 0; x <= k; x++) {
			if (cnt == 1) {
				dp[cnt][x] = 1;
				continue;
			}
			int cur = 0;
			for (int sub_tree = 1; sub_tree < cnt; sub_tree++) {
				add(cur, mult(suff[sub_tree][x + 1], mult(dp[cnt - sub_tree][x], c[cnt - 2][sub_tree - 1])));	
			}
			dp[cnt][x] = cur;
		}
		for (int x = k; x >= 0; x--) {
			add(suff[cnt][x] = suff[cnt][x + 1], dp[cnt][x]);
		}
	}
	cout << dp[n + 1][0];
	return 0;
}