← Home
```go
package main

import (
	"fmt"
	"sort"
)

func isLucky(n int64) bool {
	for n > 0 {
		d := n % 10
		if d != 4 && d != 7 {
			return false
		}
		n /= 10
	}
	return true
}

var luckyNums []int64

func gen(val int64) {
	if val > 1000000000 {
		return
	}
	if val > 0 {
		luckyNums = append(luckyNums, val)
	}
	
	if val*10+4 <= 1000000000 {
		gen(val*10 + 4)
	}
	if val*10+7 <= 1000000000 {
		gen(val*10 + 7)
	}
}

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

	gen(0)
	sort.Slice(luckyNums, func(i, j int) bool { return luckyNums[i] < luckyNums[j] })

	fact := make([]int64, 16)
	fact[0] = 1
	for i := 1; i <= 15; i++ {
		fact[i] = fact[i-1] * int64(i)
	}

	if n <= 15 && k > fact[n] {
		fmt.Println("-1")
		return
	}

	suffixLen := int64(13)
	if n < 13 {
		suffixLen = n
	}

	prefixEnd := n - suffixLen
	ans := 0

	for _, x := range luckyNums {
		if x <= prefixEnd {
			ans++
		} else {
			break
		}
	}

	nums := make([]int64, 0, suffixLen)
	for i := int64(1); i <= suffixLen; i++ {
		nums = append(nums, prefixEnd+i)
	}

	k-- 

	for i := int64(0); i < suffixLen; i++ {
		rem := suffixLen - 1 - i
		f := fact[rem]

		idx := k / f
		k %= f

		val := nums[idx]
		nums = append(nums[:idx], nums[idx+1:]...)

		pos := prefixEnd + 1 + i
		if isLucky(pos) && isLucky(val) {
			ans++
		}
	}

	fmt.Println(ans)
}
```