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 <iostream>
#include<set>
#include<vector>
#include<string>
#include<algorithm>
#include<map>

using namespace std;
int mod;

int add(int a, int b)
{
	int c = a + b;
	if (c >= mod)c -= mod;
	return c;
}

int dif(int a, int b)
{
	int c = a - b;
	if (c < 0)c += mod;
	return c;
}

int mlt(int a, int b)
{
	long long c = a * 1LL * b;
	return c % mod;
}

int bp(int a, int b)
{
	if (b == 0)return 1;
	if (b % 2 == 0)
	{
		int val = bp(a, b / 2);
		return mlt(val, val);
	}
	if (b % 2 == 1)
	{
		int val = bp(a, b - 1);
		return mlt(val, a);
	}
}

int inv(int a)
{
	return bp(a, mod - 2);
}

int ibit(int mask, int i)
{
	return (mask >> i) % 2;
}

void outp(vector<vector<int>> &v)
{
	for (int i = 0; i < v.size(); i++)
	{
		for (int j = 0; j < v[i].size(); j++)cout << v[i][j] << ' ';
		cout << endl;
	}
	cout << endl;
}
vector<int>fact, ofact;
int c(int a, int b)
{
	if(b<a) return 0;
	if(a<0)return 0;
	int val=fact[b];
	val=mlt(val, ofact[a]);
	val=mlt(val, ofact[b-a]);
	return val;
}
int pth(int st, int fn, int len)
{
	return c((len+fn-st)/2, len);
}
int hg(int st, int fn, int len)
{
   if(st<0)return 0;
   if(fn<0)return 0;
   if((st+fn)%2!=len%2)return 0;
   return dif(pth(st, fn, len), pth(st, -fn-2, len));
}
int f(int st, int fn, int b1, int b2, int len)
{
	//cout<<st<<' '<<fn<<' '<<b1<<' '<<b2<<' '<<len<<endl;
	if(b1!=0)
	{
		return f(st-b1, fn-b1, 0, b2-b1, len);
	}
	if(st<0)return 0;
	if(st>b2)return 0;
	if(fn<0)return 0;
	if(fn>b2)return 0;
	if(b2>2*len)
	{
		int bv=0;
		if (st > b2 / 2)
			  bv=f(b2 - st, b2 - fn, b1, b2, len);
		 else bv=hg(st, fn, len);
	//	cout<<st<<' '<<fn<<' '<<b1<<' '<<b2<<' '<<len<<' '<<bv<<endl;
		return bv;
	}
	int pq=dif(f(st, fn, -b2-2, b2, len),
	           f(st, -fn-2, -b2-2, b2, len));
//	cout<<st<<' '<<fn<<' '<<b1<<' '<<b2<<' '<<len<<' '<<pq<<endl;
	return pq;


}
int solve(int n, int k)
{
	if(k<0)return 0;
	if(n==1)return 1;
	if(n==2)return 0;
	int ans=fact[n-1], cr=0;
	for(int mn=0; mn<n-1; mn++)
	{
		int pl=n-1-mn;
		cr=add(cr, f(pl, mn, max(n-1-k,1), k+1,  n-1));
	}
	//cout<<n<<' '<<k<<' '<<cr<<endl;
	return mlt(ans,cr);
}
int main()
{
	int n, k;
	cin>>n>>k>>mod;
	fact.resize(300);
	ofact.resize(300);
	fact[0]=1;
	ofact[0]=1;
	for(int i=1; i<300; i++)
	{
		fact[i]=mlt(fact[i-1], i);
		ofact[i]=inv(fact[i]);
	}
	int ans=0;
	for(int low=1; low<=n; low++)
	{
		int val=solve(low, k-n+low);
		val=mlt(val, c(low,n));
		val=mlt(val, fact[n-low]);
		ans=add(ans, val);
	}
    cout<<ans<<endl;
}