//~ while (clock()<=69*CLOCKS_PER_SEC)
//~ #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//~ #pragma GCC target ("avx2")
//~ #pragma GCC optimize("Ofast")
//~ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//~ #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

#define shandom_ruffle random_shuffle

using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using vi=vector<int>;
using vll=vector<ll>;
const int nax=207;
ll mod;

int n, k;

ll kom[nax][nax];
ll sil[nax];

ll wyn;

inline void dod(ll &a, ll b)
{
	if ((a+=b)>=mod)
		a-=mod;
}

void sdod(ll &a, ll b)
{
	a=(a+b)%mod;
}

ll dp[nax][nax];

int main()
{
	scanf("%d%d%lld", &n, &k, &mod);
	sil[0]=1;
	for (int i=1; i<=n; i++)
		sil[i]=(sil[i-1]*i)%mod;
	for (int i=0; i<=n; i++)
	{
		kom[i][0]=1;
		for (int j=1; j<=i; j++)
			kom[i][j]=(kom[i-1][j-1]+kom[i-1][j])%mod;
	}
	if (k==n-1)
		wyn=sil[n];
	for (int r=3; r<=n; r++)
	{
		ll spo=kom[n][r]*sil[r-1]%mod*sil[n-r]%mod;
		int naj=k-(n-r);
		if (naj<=0)
			continue;
		//~ debug() << imie(spo) << imie(naj);
		for (int s=2; s<r; s++)
		{
			int lew=s-1;
			int pra=r-s;
			//~ sdod(wyn, kom[lew+pra+1][lew]*spo);
			if (lew>naj)
				continue;
			//~ debug() << imie(lew) << imie(pra) << imie(wyn);
			//~ if (!lew)
			//~ {
				//~ if (r-2<=naj)
					//~ dod(wyn, spo);
				//~ continue;
			//~ }
			memset(dp, 0, sizeof(dp));
			dp[1][0]=1;
			for (int i=1; i<=lew; i++)
			{
				for (int j=0; j<=pra; j++)
				{
					if (!dp[i][j])
						continue;
					//~ debug() << i << " " << j << " " << dp[i][j];
					//~ if (lew-i+j+1<=naj)
						dod(dp[i+1][j], dp[i][j]);
					if (pra-(j+1)+i<=naj && lew-i+j+1<=naj)
						dod(dp[i][j+1], dp[i][j]);
					if (i==lew && j && (j==pra || pra-(j+1)+lew+1<=naj))
					{
						//~ debug() << "tak";
						sdod(wyn, dp[i][j]*spo);
					}
				}
			}
			//~ for (int i=2; i<=s; i++)
			//~ {
				//~ for (int j=s; j<=r; j++)
				//~ {
					//~ if (j<r)
						//~ dod(dp[i][j+1], dp[i][j]);
					//~ if (i==s-1)
					//~ {
						
					//~ }
					//~ else
					//~ {
						//~ if (j-i>naj || r-1-(j-i)>naj)
							//~ continue;
						//~ dod(dp[i+1][j], dp[i][j]);
					//~ }
				//~ }
			//~ }
		}
	}
	
	printf("%lld\n", wyn);
	return 0;
}


Measured memory_bytes: 4356