← Home
```go
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
	"sort"
)

type Int128 struct {
	hi, lo uint64
}

func Add(a, b Int128) Int128 {
	lo, carry := bits.Add64(a.lo, b.lo, 0)
	hi, _ := bits.Add64(a.hi, b.hi, carry)
	return Int128{hi, lo}
}

func Sub(a, b Int128) Int128 {
	lo, borrow := bits.Sub64(a.lo, b.lo, 0)
	hi, _ := bits.Sub64(a.hi, b.hi, borrow)
	return Int128{hi, lo}
}

func FromMul64(a, b uint64) Int128 {
	hi, lo := bits.Mul64(a, b)
	return Int128{hi, lo}
}

func LessEqual(a, b Int128) bool {
	if a.hi < b.hi {
		return true
	}
	if a.hi > b.hi {
		return false
	}
	return a.lo <= b.lo
}

var lucky []int64

func genLucky(current int64) {
	if current > 5000000000000000000 {
		return
	}
	if current > 0 {
		lucky = append(lucky, current)
	}
	if current > 500000000000000000 {
		return
	}
	genLucky(current*10 + 4)
	genLucky(current*10 + 7)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 1024*1024)

	scanInt64 := func() int64 {
		scanner.Scan()
		b := scanner.Bytes()
		var x int64
		for _, c := range b {
			x = x*10 + int64(c-'0')
		}
		return x
	}

	if !scanner.Scan() {
		return
	}
	var n int
	for _, c := range scanner.Bytes() {
		n = n*10 + int(c-'0')
	}
	k := scanInt64()

	ls := make([]int64, n)
	rs := make([]int64, n)
	minLen := int64(2000000000000000000)

	for i := 0; i < n; i++ {
		ls[i] = scanInt64()
		rs[i] = scanInt64()
		if rs[i]-ls[i] < minLen {
			minLen = rs[i] - ls[i]
		}
	}

	sort.Slice(ls, func(i, j int) bool { return ls[i] < ls[j] })
	sort.Slice(rs, func(i, j int) bool { return rs[i] < rs[j] })

	pSumL := make([]Int128, n+1)
	pSumR := make([]Int128, n+1)

	for i := 0; i < n; i++ {
		pSumL[i+1] = Add(pSumL[i], Int128{0, uint64(ls[i])})
		pSumR[i+1] = Add(pSumR[i], Int128{0, uint64(rs[i])})
	}

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

	k128 := Int128{0, uint64(k)}

	calcF := func(x int64) Int128 {
		idx := sort.Search(n, func(i int) bool { return ls[i] > x })
		count := uint64(n - idx)
		if count == 0 {
			return Int128{0, 0}
		}
		sumPart := Sub(pSumL[n], pSumL[idx])
		subPart := FromMul64(count, uint64(x))
		return Sub(sumPart, subPart)
	}

	calcG := func(x int64) Int128 {
		idx := sort.Search(n, func(i int) bool { return rs[i] >= x })
		count := uint64(idx)
		if count == 0 {
			return Int128{0, 0}
		}
		term := FromMul64(count, uint64(x))
		sumPart := pSumR[idx]
		return Sub(term, sumPart)
	}

	ans := 0
	ptrLen := 0
	ptrCost := 0
	m := len(lucky)

	for right := 0; right < m; right++ {
		for lucky[right]-lucky[ptrLen] > minLen {
			ptrLen++
		}

		costG := calcG(lucky[right])
		if !LessEqual(costG, k128) {
			break
		}
		remK := Sub(k128, costG)

		for ptrCost <= right {
			if LessEqual(calcF(lucky[ptrCost]), remK) {
				break
			}
			ptrCost++
		}

		start := ptrLen
		if ptrCost > start {
			start = ptrCost
		}
		if start <= right {
			curr := right - start + 1
			if curr > ans {
				ans = curr
			}
		}
	}
	fmt.Println(ans)
}
```