#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
using namespace __gnu_pbds;
using namespace std;
using ll = long long;
using ld = long double;
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
#define mp make_pair
int MOD;
int mul(int a, int b) {
return (1LL * a * b) % MOD;
}
int add(int a, int b) {
int s = (a+b);
if (s>=MOD) s-=MOD;
return s;
}
int sub(int a, int b) {
int s = (a+MOD-b);
if (s>=MOD) s-=MOD;
return s;
}
int po(int a, ll deg)
{
if (deg==0) return 1;
if (deg%2==1) return mul(a, po(a, deg-1));
int t = po(a, deg/2);
return mul(t, t);
}
int inv(int n)
{
return po(n, MOD-2);
}
mt19937 rnd(time(0));
const int LIM = 40000;
vector<int> facs(LIM), invfacs(LIM);
vector<vector<int>> C(400, vector<int>(400));
vector<int> degs(LIM);
void init()
{
facs[0] = 1;
for (int i = 1; i<LIM; i++) facs[i] = mul(facs[i-1], i);
invfacs[LIM-1] = inv(facs[LIM-1]);
for (int i = LIM-2; i>=0; i--) invfacs[i] = mul(invfacs[i+1], i+1);
for (int i = 0; i<400; i++)
for (int j = 0; j<=i; j++)
{
C[i][j] = mul(facs[i], mul(invfacs[j], invfacs[i-j]));
}
degs[0] = 1;
for (int i = 1; i<LIM; i++) degs[i] = mul(2, degs[i-1]);
}
int solve1(int n, int k)
{
vector<vector<int>> ch_diff(n+1, vector<int>(k+1));
//Choose len distinct nonzero numbers from 1 to 2^k-1 such that each bit is present somewhere
for (int len = 1; len<=n; len++)
{
for (int bits = 1; bits<=k; bits++)
{
int tot = sub(degs[bits], 1);
ch_diff[len][bits] = 1;
for (int i = 0; i<len; i++) {
ch_diff[len][bits] = mul(ch_diff[len][bits], sub(tot, i));
}
//ch[len][bits] = mul(ch[len][bits], invfacs[len]);
for (int bits1 = 1; bits1<bits; bits1++)
{
ch_diff[len][bits] = sub(ch_diff[len][bits], mul(ch_diff[len][bits1], C[bits][bits1]));
}
}
}
ch_diff[0][0] = 1;
/*cout<<"CH_DIFF:"<<endl;
for (int len = 0; len<=n; len++)
{
cout<<len<<": ";
for (int bits = 0; bits<=k; bits++)
{
//cout<<sub(po(po(2, bits), len), dp_part[len][bits])<<' ';
cout<<ch_diff[len][bits]<<' ';
}
cout<<endl;
}*/
vector<vector<int>> ch(n+1, vector<int>(k+1));
//Choose len numbers from 0 to 2^k-1 such that each bit is present somewhere
for (int len = 0; len<=n; len++)
{
for (int bits = 0; bits<=k; bits++)
{
ch[len][bits] = degs[bits*len];
for (int bits1 = 0; bits1<bits; bits1++)
{
ch[len][bits] = sub(ch[len][bits], mul(ch[len][bits1], C[bits][bits1]));
}
}
}
/*cout<<"CH:"<<endl;
for (int len = 1; len<=n; len++)
{
cout<<len<<": ";
for (int bits = 0; bits<=k; bits++)
{
//cout<<sub(po(po(2, bits), len), dp_part[len][bits])<<' ';
cout<<ch[len][bits]<<' ';
}
cout<<endl;
}*/
vector<vector<int>> dp_part(n+1, vector<int>(k+1));
//Choose len numbers from 0 to 2^k-1 such that each bit is present somewhere and it's impossible to permutate
for (int len = 1; len<=n; len++)
{
for (int bits = 0; bits<=k; bits++)
{
int ans = 0;
for (int sz_bad = 1; sz_bad<=len; sz_bad++)
for (int bits_bad = 1; bits_bad<=bits; bits_bad++)
{
int good_rem = sub(ch[len-sz_bad][bits-bits_bad], dp_part[len-sz_bad][bits-bits_bad]);
//good arrays of length len-sz_bad on exactly bits-bits_bad bits
int adding = mul(ch_diff[sz_bad][bits_bad], good_rem);
adding = mul(adding, C[len][sz_bad]);
adding = mul(adding, C[bits][bits_bad]);
adding = mul(adding, degs[(bits-bits_bad)*sz_bad]);
ans = add(ans, adding);
}
dp_part[len][bits] = ans;
}
}
/*cout<<"DP_PART:"<<endl;
for (int len = 1; len<=n; len++)
{
cout<<len<<": ";
for (int bits = 0; bits<=k; bits++)
{
//cout<<sub(po(po(2, bits), len), dp_part[len][bits])<<' ';
cout<<dp_part[len][bits]<<' ';
}
cout<<endl;
}*/
int answer = 0;
int min_sz_bad = 1; if (n%2==1) min_sz_bad = 2;
for (int bits = 0; bits<=k; bits++)
{
int subans = 0;
for (int sz_bad = min_sz_bad; sz_bad<=n; sz_bad++)
for (int bits_bad = 1; bits_bad<=bits; bits_bad++)
{
int good_rem = sub(ch[n-sz_bad][bits-bits_bad], dp_part[n-sz_bad][bits-bits_bad]);
//good arrays of length len-sz_bad on exactly bits-bits_bad bits
int adding = mul(ch_diff[sz_bad][bits_bad], good_rem);
adding = mul(adding, C[n][sz_bad]);
adding = mul(adding, C[bits][bits_bad]);
adding = mul(adding, degs[(bits-bits_bad)*sz_bad]);
subans = add(subans, adding);
//cout<<bits<<' '<<sz_bad<<' '<<bits_bad<<": "<<subans<<endl;
}
subans = sub(ch[n][bits], subans);
subans = mul(subans, C[k][bits]);
//cout<<ch[n][bits]<<' '<<subans<<endl;
answer = add(answer, subans);
}
return answer;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int n, k; cin>>n>>k>>MOD;
init();
cout<<solve1(n, k)<<endl;
}