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 <cstdio>
#include <cstring>
#include <iostream>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define inver(a) power(a,mod-2)
using namespace std;
inline char gc() {
	return getchar();
	static char buf[100000],*l=buf,*r=buf;
	return l==r&&(r=(l=buf)+fread(buf,1,100000,stdin),l==r)?EOF:*l++;
}
template<class T> void rd(T &x) {
	x=0; int f=1,ch=gc();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
	while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=gc();}
	x*=f;
}
typedef long long ll;
const int maxn=200+5;
int n,K,mod;
int fac[maxn],inv[maxn],C[maxn][maxn];
int dp[maxn][maxn];
inline int add(int x) {return x>=mod?x-mod:x;}
ll power(ll x,ll y) {
	ll re=1;
	while(y) {
		if(y&1) re=re*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return re;
}
int sol(int k,int l,int K) {
	memset(dp,0,sizeof(dp));
	dp[0][0]=1;
	for(int j=1;j<=l;++j) {
		int sum=0;
		for(int i=0;i<k;++i) {
			sum=add(sum+dp[i][j-1]);
			if((l-j+1)+(i-1)<=K&&(k-i)+(j-1)<=K) dp[i][j]=sum;
		}
	}
	int an=0;
	for(int i=1;i<k;++i) an=add(an+dp[i][l]);
	return an;
}
int sol(int n,int K) {
	if(n==1) return 1;
	int an=0;
	for(int i=1;i<=K+1;++i) an=add(an+sol(i,n-i,K));
	an=(ll)an*fac[n-1]%mod;
//	debug("%d %d %d\n",n,K,an);
	return an;
}
void init() {
	fac[0]=1;
	for(int i=1;i<=n;++i) fac[i]=(ll)fac[i-1]*i%mod;
	inv[n]=inver(fac[n]);
	for(int i=n;i>=1;--i) inv[i-1]=(ll)inv[i]*i%mod;
	for(int i=0;i<=n;++i) {
		C[i][0]=C[i][i]=1;
		for(int j=1;j<i;++j) C[i][j]=add(C[i-1][j-1]+C[i-1][j]); 
	}
}
int main() {
	rd(n),rd(K),rd(mod);
	init();
	int an=0;
	for(int i=0;i<=K;++i) an=(an+(ll)sol(n-i,K-i)*C[n][i]%mod*fac[i])%mod;
	printf("%d\n",an);
	return 0;
} 