package main
import (
"fmt"
)
func main() {
var n, k int
var m int64
_, err := fmt.Scan(&n, &k, &m)
if err != nil {
return
}
MOD := m
power2 := make([]int64, k*n+1)
power2[0] = 1
for i := 1; i <= k*n; i++ {
power2[i] = (power2[i-1] * 2) % MOD
}
maxKN := k
if n > k {
maxKN = n
}
C := make([][]int64, maxKN+1)
for i := 0; i <= maxKN; i++ {
C[i] = make([]int64, maxKN+1)
C[i][0] = 1
for j := 1; j <= i; j++ {
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD
}
}
P_val := make([][]int64, k+1)
P_val[0] = make([]int64, n+1)
for K := 0; K <= n; K++ {
P_val[0][K] = 0
}
P_val[0][0] = 1
for diff := 1; diff <= k; diff++ {
P_val[diff] = make([]int64, n+1)
val := (power2[diff] - 1 + MOD) % MOD
P_val[diff][0] = 1
for K := 1; K <= n; K++ {
P_val[diff][K] = (P_val[diff][K-1] * ((val - int64(K) + 1 + MOD) % MOD)) % MOD
}
}
dp := make([][]int64, k+1)
for i := 0; i <= k; i++ {
dp[i] = make([]int64, n+1)
}
for i := 0; i <= k; i++ {
for j := 0; j <= n; j++ {
sum := int64(0)
for m_ := 0; m_ < i; m_++ {
diff := i - m_
termSum := int64(0)
for c := 0; c <= j; c++ {
term := C[j][c] * dp[m_][c] % MOD
term = term * P_val[diff][j-c] % MOD
term = term * power2[m_*(j-c)] % MOD
termSum += term
if termSum >= MOD {
termSum -= MOD
}
}
sum += C[i][m_] * termSum % MOD
if sum >= MOD {
sum -= MOD
}
}
dp[i][j] = (power2[i*j] - sum + MOD) % MOD
}
}
ans := int64(0)
if n%2 == 0 {
for m_ := 0; m_ <= k; m_++ {
term := C[k][m_] * dp[m_][n] % MOD
ans = (ans + term) % MOD
}
} else {
for m_ := 0; m_ <= k; m_++ {
term1 := dp[m_][n]
term2 := int64(0)
if n >= 1 {
term2 = int64(n) * dp[m_][n-1] % MOD
term2 = term2 * P_val[k-m_][1] % MOD
term2 = term2 * power2[m_] % MOD
}
term := (term1 + term2) % MOD
term = C[k][m_] * term % MOD
ans = (ans + term) % MOD
}
}
fmt.Println(ans)
}