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()
}