← Home
```go
package main

import (
	"fmt"
)

var n int
var k int64

var memo [26][2][2][2]int64
var visited [26][2][2][2]bool
var P string
var L int

func count_valid() int64 {
	for i := 0; i < 26; i++ {
		for j := 0; j < 2; j++ {
			for x := 0; x < 2; x++ {
				for y := 0; y < 2; y++ {
					visited[i][j][x][y] = false
				}
			}
		}
	}
	return dp(0, 0, 0, 1)
}

func dp(i int, s1 int, s2 int, is_zero int) int64 {
	if s1 == 2 || s2 == 2 {
		return 0
	}
	if i > (n-1)/2 {
		if is_zero == 1 {
			return 0
		}
		return 1
	}

	if visited[i][s1][s2][is_zero] {
		return memo[i][s1][s2][is_zero]
	}

	var ans int64 = 0

	var v1_cands []int
	if i < L {
		v1_cands = []int{int(P[i] - '0')}
	} else {
		v1_cands = []int{0, 1}
	}

	var v2_cands []int
	if n-1-i < L {
		v2_cands = []int{int(P[n-1-i] - '0')}
	} else {
		v2_cands = []int{0, 1}
	}

	for _, v1 := range v1_cands {
		for _, v2 := range v2_cands {
			if i == n-1-i && v1 != v2 {
				continue
			}

			ns1 := s1
			if s1 == 0 {
				if v1 < v2 {
					ns1 = 1
				} else if v1 > v2 {
					ns1 = 2
				}
			}

			ns2 := s2
			if s2 == 0 {
				if v1 < 1-v2 {
					ns2 = 1
				} else if v1 > 1-v2 {
					ns2 = 2
				}
			}

			if ns1 == 2 || ns2 == 2 {
				continue
			}

			n_is_zero := is_zero
			if v1 != 0 || v2 != 0 {
				n_is_zero = 0
			}

			ans += dp(i+1, ns1, ns2, n_is_zero)
		}
	}

	visited[i][s1][s2][is_zero] = true
	memo[i][s1][s2][is_zero] = ans
	return ans
}

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

	P = ""
	L = 0
	total := count_valid()
	if k > total {
		fmt.Println("-1")
		return
	}

	for len(P) < n {
		P += "0"
		L = len(P)
		cnt := count_valid()
		if k > cnt {
			k -= cnt
			P = P[:len(P)-1] + "1"
		}
	}
	fmt.Println(P)
}
```