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>
#define ll long long
#define ld long double
#define db double
#define pint pair<int,ll>
#define mk make_pair
#define pb push_back
#define eb emplace_back
#define ins insert
#define fi first
#define se second
#define Rep(x,y,z) for(int x=y;x<=z;x++)
#define Red(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
const int MAXN=205;
char buf[1<<12],*pp1=buf,*pp2=buf,nc;int ny;
inline char gc() {return pp1==pp2&&(pp2=(pp1=buf)+fread(buf,1,1<<12,stdin),pp1==pp2)?EOF:*pp1++;}
//inline char gc(){return getchar();}
inline int read(){
	int x=0;for(ny=1;nc=gc(),(nc<48||nc>57)&&nc!=EOF;)if(nc==45)ny=-1;if(nc<0)return nc;
	for(x=nc-48;nc=gc(),47<nc&&nc<58&&nc!=EOF;x=(x<<3)+(x<<1)+(nc^48));return x*ny;
}
int n,k,Mod,Fac[MAXN],iFac[MAXN];
inline void Add(int&x,int y){x+=y,x>=Mod?x-=Mod:0;}
inline int Fp(int x,int k){int ans=1;for(;k;k>>=1,x=1ll*x*x%Mod)if(k&1)ans=1ll*ans*x%Mod;return ans;}
inline void Init(int n){
	Fac[0]=1;Rep(i,1,n)Fac[i]=1ll*Fac[i-1]*i%Mod;
	iFac[n]=Fp(Fac[n],Mod-2);Red(i,n,1)iFac[i-1]=1ll*iFac[i]*i%Mod;
}
inline int Solve(int n,int k){
	int ans=0;
	Rep(deg,1,min(k,n-2)){
		static int dp[MAXN][MAXN];
		if(n-1-deg>k)continue;
		memset(dp,0,sizeof(dp)),dp[0][deg]=1,dp[0][deg+1]=Mod-1;
		Rep(i,0,deg-1)Rep(j,deg,n-1){
			Add(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)Add(dp[i+1][l],tmp),Add(dp[i+1][r+1],Mod-tmp);
		}Rep(i,deg,n-1)Add(dp[deg][i],dp[deg][i-1]),Add(ans,dp[deg][i]);
	}return 1ll*ans*Fac[n-1]%Mod;
}
int main(){
//	freopen("std.in","r",stdin);
//	freopen("std.out","w",stdout);
	n=read(),k=read(),Mod=read(),Init(n);int ans=(k==n-1)?Fac[n]:0;
	Rep(i,3,n)ans=(ans+1ll*Fac[n]*iFac[i]%Mod*Solve(i,k-(n-i)))%Mod;
	cout<<ans<<'\n';
	return 0;
}


