← Home
For problem statement at 0-999/300-399/330-339/333/problemC.txt this is a correct solution, but verifier at 0-999/300-399/330-339/333/verifierC.go ends with case 2 failed: ticket 08270000 is not 827-lucky
exit status 1 can you fix the verifier? package main

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

var pow10 = [9]int{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}

func getOrders(f int) [][]int {
	switch f {
	case 4:
		return [][]int{{4}, {3, 1}, {1, 3}, {2, 2}, {2, 1, 1}, {1, 2, 1}, {1, 1, 2}, {1, 1, 1, 1}}
	case 3:
		return [][]int{{3}, {2, 1}, {1, 2}, {1, 1, 1}}
	case 2:
		return [][]int{{2}, {1, 1}}
	case 1:
		return [][]int{{1}}
	case 0:
		return [][]int{{}}
	}
	return nil
}

func generate(d int, orders [][]int, k, m int, ans *[]int, seen map[int]struct{}) bool {
	f := 8 - d
	maxU := pow10[f]
	var digits [4]int
	var freeVals [4]int
	var tVals [16]int

	for _, ord := range orders {
		n := len(ord)
		signMax := 1 << n

		for u := 0; u < maxU; u++ {
			tmp := u
			for i := f - 1; i >= 0; i-- {
				digits[i] = tmp % 10
				tmp /= 10
			}

			idx := 0
			for i := 0; i < n; i++ {
				v := 0
				for j := 0; j < ord[i]; j++ {
					v = v*10 + digits[idx]
					idx++
				}
				freeVals[i] = v
			}

			for mask := 0; mask < signMax; mask++ {
				t := 0
				for i := 0; i < n; i++ {
					if (mask>>i)&1 == 1 {
						t += freeVals[i]
					} else {
						t -= freeVals[i]
					}
				}
				tVals[mask] = t
			}

			for pos := 0; pos <= n; pos++ {
				for mask := 0; mask < signMax; mask++ {
					a := k - tVals[mask]
					if a < 0 || a >= pow10[d] {
						continue
					}

					ticket := 0
					fi := 0
					for g := 0; g <= n; g++ {
						if g == pos {
							ticket = ticket*pow10[d] + a
						} else {
							w := ord[fi]
							ticket = ticket*pow10[w] + freeVals[fi]
							fi++
						}
					}

					if _, ok := seen[ticket]; ok {
						continue
					}
					seen[ticket] = struct{}{}
					*ans = append(*ans, ticket)
					if len(*ans) == m {
						return true
					}
				}
			}
		}
	}

	return false
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	var k, m int
	fmt.Fscan(in, &k, &m)

	ans := make([]int, 0, m)
	seen := make(map[int]struct{}, m*2)

	for d := 4; d <= 8 && len(ans) < m; d++ {
		if generate(d, getOrders(8-d), k, m, &ans, seen) {
			break
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	var buf [9]byte
	for _, x := range ans {
		y := x
		for i := 7; i >= 0; i-- {
			buf[i] = byte('0' + y%10)
			y /= 10
		}
		buf[8] = '\n'
		out.Write(buf[:])
	}
	out.Flush()
}