← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, k, m int
	fmt.Fscan(reader, &n, &k, &m)

	const MOD = 1000000007

	
	
	
	const SIZE = 1 << 21
	dp := make([]int, SIZE)
	newDp := make([]int, SIZE)

	active := make([]int, 0, 10000)
	newActive := make([]int, 0, 10000)

	
	dp[0] = 1
	active = append(active, 0)

	
	var c [4]int
	var nextC [4]int

	for i := 1; i <= n; i++ {
		newActive = newActive[:0]

		for _, state := range active {
			ways := dp[state]
			dp[state] = 0 
			if ways == 0 {
				continue
			}

			
			j := state & 0xF
			f := (state >> 4) & 1
			activeComps := 0
			for d := 0; d < m; d++ {
				val := (state >> (5 + 4*d)) & 0xF
				c[d] = val
				activeComps += val
			}

			
			remExp := c[m-1]

			
			
			addState := func(nj, nf int, nc *[4]int) {
				
				ntotal := nf
				for d := 0; d < m; d++ {
					ntotal += nc[d]
				}
				
				
				
				if ntotal > k - nj + 1 {
					return
				}

				
				enc := nj | (nf << 4)
				for d := 0; d < m; d++ {
					enc |= (nc[d] << (5 + 4*d))
				}

				if newDp[enc] == 0 {
					newActive = append(newActive, enc)
				}
				newDp[enc] = (newDp[enc] + ways) % MOD
			}

			
			{
				valid := true
				nextF := f
				if remExp > 0 {
					
					if remExp > 1 || f == 1 {
						valid = false 
					} else {
						nextF = 1
					}
				}
				if valid {
					
					for d := 0; d < m-1; d++ {
						nextC[d+1] = c[d]
					}
					nextC[0] = 0
					addState(j, nextF, &nextC)
				}
			}

			if j < k {
				

				
				{
					valid := true
					nextF := f
					if remExp > 0 {
						if remExp > 1 || f == 1 {
							valid = false
						} else {
							nextF = 1
						}
					}
					if valid {
						for d := 0; d < m-1; d++ {
							nextC[d+1] = c[d]
						}
						nextC[0] = 1
						addState(j+1, nextF, &nextC)
					}
				}

				
				for src := 0; src < m; src++ {
					count := c[src]
					if count == 0 {
						continue
					}
					
					
					
					
					currRemExp := remExp
					if src == m-1 {
						currRemExp--
					}
					
					valid := true
					nextF := f
					if currRemExp > 0 {
						if currRemExp > 1 || f == 1 {
							valid = false
						} else {
							nextF = 1
						}
					}
					
					if valid {
						for d := 0; d < m-1; d++ {
							cnt := c[d]
							if d == src {
								cnt--
							}
							nextC[d+1] = cnt
						}
						nextC[0] = 1
						
						oldWays := ways
						ways = int((int64(ways) * int64(count)) % int64(MOD))
						addState(j+1, nextF, &nextC)
						ways = oldWays
					}
				}

				
				totalComps := activeComps + f
				if totalComps > 0 {
					
					valid := true
					nextF := f
					if remExp > 0 {
						if remExp > 1 || f == 1 {
							valid = false
						} else {
							nextF = 1
						}
					}
					if valid {
						for d := 0; d < m-1; d++ {
							nextC[d+1] = c[d]
						}
						nextC[0] = 0
						
						oldWays := ways
						ways = int((int64(ways) * int64(totalComps)) % int64(MOD))
						addState(j+1, nextF, &nextC)
						ways = oldWays
					}
				}

				
				if totalComps >= 2 {
					for src := 0; src < m; src++ {
						count := c[src]
						if count == 0 {
							continue
						}
						
						
						currRemExp := remExp
						if src == m-1 {
							currRemExp--
						}
						
						valid := true
						nextF := f
						if currRemExp > 0 {
							if currRemExp > 1 || f == 1 {
								valid = false
							} else {
								nextF = 1
							}
						}
						
						if valid {
							for d := 0; d < m-1; d++ {
								cnt := c[d]
								if d == src {
									cnt--
								}
								nextC[d+1] = cnt
							}
							nextC[0] = 0
							
							oldWays := ways
							mult := int64(count) * int64(totalComps - 1)
							ways = int((int64(ways) * mult) % int64(MOD))
							addState(j+1, nextF, &nextC)
							ways = oldWays
						}
					}
				}
			}
		}
		
		dp, newDp = newDp, dp
		active, newActive = newActive, active
	}

	ans := 0
	for _, state := range active {
		j := state & 0xF
		if j != k {
			continue
		}
		f := (state >> 4) & 1
		activeComps := 0
		for d := 0; d < m; d++ {
			activeComps += (state >> (5 + 4*d)) & 0xF
		}
		
		if activeComps + f == 1 {
			ans = (ans + dp[state]) % MOD
		}
	}
	fmt.Println(ans)
}