Given are integers N and K, and a prime number P. Find the number, modulo P, of directed graphs G with N vertices that satisfy below. Here, the vertices are distinguishable from each other.

* G is a tournament, that is, G contains no duplicated edges or self-loops, and exactly one of the edges u\to v and v\to u exists for any two vertices u and v.
* The in-degree of every vertex in G is at most K.
* For any four distinct vertices a, b, c, and d in G, it is not the case that all of the six edges a\to b, b\to c, c\to a, a\to d, b\to d, and c\to d exist simultaneously.

Constraints

* 4 \leq N \leq 200
* \frac{N-1}{2} \leq K \leq N-1
* 10^8<P<10^9
* N and K are integers.
* P is a prime number.

Input

Input is given from Standard Input in the following format:


N K P


Output

Print the number of directed graphs that satisfy the conditions, modulo P.

Examples

Input

4 3 998244353


Output

56


Input

7 3 998244353


Output

720


Input

50 37 998244353


Output

495799508
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 205;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); } 
template <typename T> void read(T &x) {
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
int n, k, P, fac[MAXN], inv[MAXN];
int power(int x, int y) {
	if (y == 0) return 1;
	int tmp = power(x, y / 2);
	if (y % 2 == 0) return 1ll * tmp * tmp % P;
	else return 1ll * tmp * tmp % P * x % P;
}
int binom(int x, int y) {
	if (y > x) return 0;
	else return 1ll * fac[x] * inv[y] % P * inv[x - y] % P;
}
void update(int &x, int y) {
	x += y;
	if (x >= P) x -= P;
}
void init(int n) {
	fac[0] = 1;
	for (int i = 1; i <= n; i++)
		fac[i] = 1ll * fac[i - 1] * i % P;
	inv[n] = power(fac[n], P - 2);
	for (int i = n - 1; i >= 0; i--)
		inv[i] = inv[i + 1] * (i + 1ll) % P;
}
int solve(int n, int k) {
	int ans = 0;
	for (int deg = 1; deg <= k && deg <= n - 2; deg++) {
		static int dp[MAXN][MAXN];
		if ((n - 1) - deg > k) continue;
		memset(dp, 0, sizeof(dp));
		dp[0][deg] = 1, dp[0][deg + 1] = P - 1;
		for (int i = 0; i <= deg - 1; i++)
		for (int j = deg; j <= n - 1; j++) {
			update(dp[i][j], dp[i][j - 1]);
			int tmp = dp[i][j], l = max(max(j, i + 2), n + i - k), r = min(n - 1, k + (i + 1));
			if (l <= r) update(dp[i + 1][l], tmp), update(dp[i + 1][r + 1], P - tmp);
		}
		for (int i = deg; i <= n - 1; i++) {
			update(dp[deg][i], dp[deg][i - 1]);
			update(ans, dp[deg][i]);
		}
	}
	return 1ll * ans * fac[n - 1] % P;
}
int main() {
	read(n), read(k), read(P);
	init(n); int ans = (k == n - 1) ? fac[n] : 0;
	for (int i = 3; i <= n; i++)
		update(ans, 1ll * fac[n] * inv[i] % P * solve(i, k - (n - i)) % P);
	cout << ans << endl;
	return 0;
}
