← Home
package main

import (
	"fmt"
)

func solveK(n, h, k int) int64 {
	type State struct {
		x [4]int
	}
	states := []State{}
	stateToID := make(map[State]int)

	var generate func(idx int, maxVal int, current State)
	generate = func(idx int, maxVal int, current State) {
		if idx == k {
			stateToID[current] = len(states)
			states = append(states, current)
			return
		}
		for v := maxVal; v >= 0; v-- {
			current.x[idx] = v
			generate(idx+1, v, current)
		}
	}

	var startState State
	generate(0, h-1, startState)

	numStates := len(states)
	outTrans := make([]int, numStates)
	inTrans := make([][]int, numStates)
	for i := range inTrans {
		inTrans[i] = make([]int, k)
	}

	for id, s := range states {
		outS := State{}
		valid := true
		for i := 0; i < k; i++ {
			outS.x[i] = s.x[i] + 1
			if outS.x[i] >= h {
				valid = false
			}
		}
		if valid {
			outTrans[id] = stateToID[outS]
		} else {
			outTrans[id] = -1
		}

		for m := 0; m < k; m++ {
			inS := State{}
			validIn := true
			var newGaps [4]int
			for i := 0; i < k; i++ {
				if i == m {
					newGaps[i] = 0
				} else {
					g := s.x[i] + 1
					if g >= h {
						validIn = false
					}
					newGaps[i] = g
				}
			}
			if validIn {
				for i := 0; i < k; i++ {
					for j := i + 1; j < k; j++ {
						if newGaps[i] < newGaps[j] {
							newGaps[i], newGaps[j] = newGaps[j], newGaps[i]
						}
					}
				}
				for i := 0; i < k; i++ {
					inS.x[i] = newGaps[i]
				}
				inTrans[id][m] = stateToID[inS]
			} else {
				inTrans[id][m] = -1
			}
		}
	}

	type Trans struct {
		dest int
		mult int64
	}
	transitions := make([][]Trans, numStates)
	for id := 0; id < numStates; id++ {
		var dests []int
		var mults []int64
		add := func(dest int, count int64) {
			for i, d := range dests {
				if d == dest {
					mults[i] += count
					return
				}
			}
			dests = append(dests, dest)
			mults = append(mults, count)
		}
		if outTrans[id] != -1 && 4-k > 0 {
			add(outTrans[id], int64(4-k))
		}
		for m := 0; m < k; m++ {
			if inTrans[id][m] != -1 {
				add(inTrans[id][m], 1)
			}
		}
		for i, d := range dests {
			transitions[id] = append(transitions[id], Trans{d, mults[i]})
		}
	}

	dp := make([]int64, numStates)
	var initS State
	dp[stateToID[initS]] = 1

	for step := 0; step < n; step++ {
		nextDp := make([]int64, numStates)
		for id, ways := range dp {
			if ways == 0 {
				continue
			}
			for _, t := range transitions[id] {
				nextDp[t.dest] = (nextDp[t.dest] + ways*t.mult) % 1000000009
			}
		}
		dp = nextDp
	}

	var total int64 = 0
	for _, ways := range dp {
		total = (total + ways) % 1000000009
	}
	return total
}

func main() {
	var n, h int
	if _, err := fmt.Scan(&n, &h); err != nil {
		return
	}

	n1 := solveK(n, h, 1)
	n2 := solveK(n, h, 2)
	n3 := solveK(n, h, 3)
	n4 := solveK(n, h, 4)

	ans := (4*n1 - 6*n2 + 4*n3 - n4) % 1000000009
	if ans < 0 {
		ans += 1000000009
	}

	fmt.Println(ans)
}