← Home
For problem statement at 0-999/300-399/350-359/354/problemE.txt this is a correct solution, but verifier at 0-999/300-399/350-359/354/verifierE.go ends with case 1 failed on line 1: expected 0 40000040000 40000044004 40440444004 74444444044 77447474774 got 40404444704 40407000704 40407000704 40407000707 40707000007 70000000000
input:
4
272332446826
854592229752
746127945894
818711508695
exit status 1 can you fix the verifier? package main

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

type Transition struct {
	next int
	a    int
	b    int
}

type Parent struct {
	prev int
	a    int
	b    int
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var trans [5][10][]Transition
	for cin := 0; cin <= 4; cin++ {
		for a := 0; a <= 6; a++ {
			for b := 0; a+b <= 6; b++ {
				total := 4*a + 7*b + cin
				d := total % 10
				cout := total / 10
				trans[cin][d] = append(trans[cin][d], Transition{cout, a, b})
			}
		}
	}

	var pow10 [19]int64
	pow10[0] = 1
	for i := 1; i < 19; i++ {
		pow10[i] = pow10[i-1] * 10
	}

	var t int
	fmt.Fscan(in, &t)
	for ; t > 0; t-- {
		var n int64
		fmt.Fscan(in, &n)

		digits := make([]int, 0, 19)
		x := n
		if x == 0 {
			digits = append(digits, 0)
		} else {
			for x > 0 {
				digits = append(digits, int(x%10))
				x /= 10
			}
		}

		m := len(digits)
		parent := make([][5]Parent, m+1)
		cur := [5]bool{}
		cur[0] = true

		for pos := 0; pos < m; pos++ {
			d := digits[pos]
			nxt := [5]bool{}
			for cin := 0; cin <= 4; cin++ {
				if !cur[cin] {
					continue
				}
				for _, tr := range trans[cin][d] {
					if !nxt[tr.next] {
						nxt[tr.next] = true
						parent[pos+1][tr.next] = Parent{cin, tr.a, tr.b}
					}
				}
			}
			cur = nxt
		}

		if !cur[0] {
			fmt.Fprintln(out, -1)
			continue
		}

		aCnt := make([]int, m)
		bCnt := make([]int, m)
		carry := 0
		for pos := m; pos >= 1; pos-- {
			p := parent[pos][carry]
			aCnt[pos-1] = p.a
			bCnt[pos-1] = p.b
			carry = p.prev
		}

		var nums [6]int64
		for pos := 0; pos < m; pos++ {
			pw := pow10[pos]
			a := aCnt[pos]
			b := bCnt[pos]
			for i := 0; i < a; i++ {
				nums[i] += 4 * pw
			}
			for i := a; i < a+b; i++ {
				nums[i] += 7 * pw
			}
		}

		for i := 0; i < 6; i++ {
			if i > 0 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, nums[i])
		}
		fmt.Fprintln(out)
	}
}