← Home
```go
package main

import (
	"io"
	"os"
	"strconv"
	"strings"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		x := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			x = x*10 + int(data[idx]-'0')
			idx++
		}
		return x
	}

	t := nextInt()
	var out strings.Builder

	for ; t > 0; t-- {
		n := nextInt()
		k := nextInt()
		p := int64(nextInt())

		if n == 1 {
			out.WriteString("1\n")
			continue
		}

		inv := make([]int64, k+1)
		if k >= 1 {
			inv[1] = 1
		}
		for i := 2; i <= k; i++ {
			inv[i] = (p - (p/int64(i))*inv[p%int64(i)]%p) % p
		}

		hPrev := make([]int64, k+1)
		hCur := make([]int64, k+1)
		dPrev := make([]int64, k+1)
		dCur := make([]int64, k+1)
		w := make([]int64, k+1)

		for i := 0; i <= k; i++ {
			hPrev[i] = 1
			dPrev[i] = 1
		}

		pow2 := int64(2 % p)

		for level := 2; level <= n; level++ {
			pow2 = pow2 * 2 % p
			r := pow2 - 2
			if r < 0 {
				r += p
			}

			hCur[0] = 1
			for j := 1; j <= k; j++ {
				term := r + int64(j)
				if term >= p {
					term -= p
				}
				hCur[j] = hCur[j-1] * term % p * inv[j] % p
			}

			for i := 0; i <= k; i++ {
				w[i] = 0
			}

			maxT := (k - 1) / 2
			for t0 := 0; t0 <= maxT; t0++ {
				ht := hPrev[t0]
				if ht == 0 {
					continue
				}
				maxS := k - t0
				for s := t0 + 1; s <= maxS; s++ {
					u := s + t0
					w[u] = (w[u] + dPrev[s]*ht) % p
				}
			}

			var pref int64 = 0
			for u := 0; u <= k; u++ {
				pref += w[u]
				if pref >= p {
					pref -= p
				}
				val := pref + pref
				if val >= p {
					val -= p
				}
				dCur[u] = val
			}

			hPrev, hCur = hCur, hPrev
			dPrev, dCur = dCur, dPrev
		}

		out.WriteString(strconv.FormatInt(dPrev[k], 10))
		out.WriteByte('\n')
	}

	os.Stdout.WriteString(out.String())
}
```