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;

#define int long long

#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define eb emplace_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second

using vint=vector<int>;
using pint=pair<int,int>;
using vpint=vector<pint>;

template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

template<class A,class B>
ostream& operator<<(ostream& ost,const pair<A,B>&p){
	ost<<"{"<<p.first<<","<<p.second<<"}";
	return ost;
}

template<class T>
ostream& operator<<(ostream& ost,const vector<T>&v){
	ost<<"{";
	for(int i=0;i<v.size();i++){
		if(i)ost<<",";
		ost<<v[i];
	}
	ost<<"}";
	return ost;
}

inline int topbit(unsigned long long x){
	return x?63-__builtin_clzll(x):-1;
}

inline int popcount(unsigned long long x){
	return __builtin_popcountll(x);
}

inline int parity(unsigned long long x){
	return __builtin_parity(x);
}

int P;

int mpow(int n,int m){
	int ret=1;
	while(m){
		if(m&1)ret=ret*n%P;
		n=n*n%P;
		m>>=1;
	}
	return ret;
}

inline void add(int &a,int b){
	a+=b;
	if(a>=P)a-=P;
}

const int SIZE=200;
int fact[222];
int finv[222];

/*
x y t


t : mode  (0 or 1)
0 : y->y+1
1 : x->x+1
*/
int dp[222][222][2];

int solve(int N,int K){
	int ret=0;
	for(int X=1;X<=K+1&&N-X>=1;X++){
		int Y=N-X;

		memset(dp,0,sizeof(dp));
		for(int a=1;a<X;a++){
			if(a+Y<=K+1&&X-a+1<=K+1)dp[a][1][0]=a;
		}

		for(int x=1;x<=X;x++){
			for(int y=1;y<=Y;y++){
				if(y+1+(X-x)<=K+1&&y+1<=Y){
					add(dp[x][y+1][0],dp[x][y][0]);
					add(dp[x][y+1][0],dp[x][y][1]);
				}
				if(x+1+(Y-y)<=K+1){
					add(dp[x+1][y][1],dp[x][y][1]);
					add(dp[x+1][y][1],dp[x][y][0]);
				}
			}
		}

		int tmp=dp[X][Y][1];
		add(ret,tmp);
	}
	ret=ret*fact[N-1]%P;
	return ret;
}

signed main(){
	int N,K;
	cin>>N>>K>>P;

	fact[0]=1;
	for(int i=1;i<=SIZE;i++)fact[i]=fact[i-1]*i%P;
	finv[SIZE]=mpow(fact[SIZE],P-2);
	for(int i=SIZE-1;i>=0;i--)finv[i]=finv[i+1]*(i+1)%P;
	
	int ans=0;
	for(int i=0;i<=N;i++){
		int n=N-i;
		int k=K-i;
		if(n<3)continue;
		if((n-1)/2>k)continue;
		int tmp=solve(n,k);
		tmp=tmp*fact[N]%P*finv[n]%P;
		add(ans,tmp);
	}
	if(K==N-1)add(ans,fact[N]);
	cout<<ans<<endl;
	return 0;
}
