← Home
For problem statement at 1000-1999/1900-1999/1920-1929/1928/problemE.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1920-1929/1928/verifierE.go ends with panic: runtime error: index out of range [701] with length 701

goroutine 1 [running]:
main.init.0()
	/tmp/build-86468863/solution.go:53 +0x458
candidate error: exit status 2
exit status 1 can you fix the verifier?  ```go
package main

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

const (
	MAX_C    = 200000
	MAX_M    = 1000
	MAX_TRI  = 700
	WORDSIZE = 64
	MAX_WORD = (MAX_C + WORDSIZE) / WORDSIZE
)

var tri []int
var isTri []bool
var isSum2 []bool
var dp [][]uint64

func init() {
	tri = make([]int, MAX_TRI+1)
	for i := 0; i <= MAX_TRI; i++ {
		tri[i] = i * (i + 1) / 2
	}

	isTri = make([]bool, MAX_C+1)
	for i := 0; i <= MAX_TRI; i++ {
		if tri[i] <= MAX_C {
			isTri[tri[i]] = true
		}
	}

	isSum2 = make([]bool, MAX_C+1)
	for i := 0; i <= MAX_TRI; i++ {
		for j := i; j <= MAX_TRI; j++ {
			s := tri[i] + tri[j]
			if s > MAX_C {
				break
			}
			isSum2[s] = true
		}
	}

	dp = make([][]uint64, MAX_M+1)
	dp[0] = make([]uint64, MAX_WORD)
	dp[0][0] = 1

	for m := 1; m <= MAX_M; m++ {
		bs := make([]uint64, MAX_WORD)
		for k := 1; k <= m; k++ {
			shift := tri[k-1]
			if shift > MAX_C {
				continue
			}
			wordShift := shift / WORDSIZE
			bitShift := shift % WORDSIZE
			src := dp[m-k]
			if bitShift == 0 {
				for i := 0; i+wordShift < MAX_WORD; i++ {
					bs[i+wordShift] |= src[i]
				}
			} else {
				for i := 0; i+wordShift < MAX_WORD; i++ {
					bs[i+wordShift] |= src[i] << bitShift
					if i+wordShift+1 < MAX_WORD {
						bs[i+wordShift+1] |= src[i] >> (WORDSIZE - bitShift)
					}
				}
			}
		}
		dp[m] = bs
	}
}

func isSet(bs []uint64, pos int) bool {
	return (bs[pos/WORDSIZE]>>uint(pos%WORDSIZE))&1 == 1
}

func findPartition(C, m int) ([]int, bool) {
	if C < 0 || C > m*(m-1)/2 {
		return nil, false
	}
	if m == 0 {
		if C == 0 {
			return []int{}, true
		}
		return nil, false
	}

	if m <= MAX_M {
		if !isSet(dp[m], C) {
			return nil, false
		}
		blocks := make([]int, 0)
		curM, curC := m, C
		for curM > 0 {
			for k := 1; k <= curM; k++ {
				need := tri[k-1]
				if curC >= need && isSet(dp[curM-k], curC-need) {
					blocks = append(blocks, k)
					curM -= k
					curC -= need
					break
				}
			}
		}
		return blocks, true
	}

	// Large m: use 3 triangular numbers (Gauss)
	// Also check 1 and 2 for efficiency
	blocks := make([]int, 0)
	rem := m

	if C == 0 {
		for i := 0; i < rem; i++ {
			blocks = append(blocks, 1)
		}
		return blocks, true
	}

	// Check 1 number
	for a := 0; a <= MAX_TRI && tri[a] <= C; a++ {
		if tri[a] == C {
			if a+1 <= m {
				return []int{a + 1}, true
			}
		}
	}

	// Check 2 numbers
	for a := 0; a <= MAX_TRI && tri[a] <= C; a++ {
		rem1 := C - tri[a]
		for b := 0; b <= MAX_TRI && tri[b] <= rem1; b++ {
			if tri[b] == rem1 {
				len := (a + 1) + (b + 1)
				if len <= m {
					blocks = append(blocks, a+1, b+1)
					for i := len; i < m; i++ {
						blocks = append(blocks, 1)
					}
					return blocks, true
				}
			}
		}
	}

	// Check 3 numbers
	for a := 0; a <= MAX_TRI && tri[a] <= C; a++ {
		rem1 := C - tri[a]
		for b := 0; b <= MAX_TRI && tri[b] <= rem1; b++ {
			rem2 := rem1 - tri[b]
			if rem2 > MAX_C {
				continue
			}
			if !isTri[rem2] {
				continue
			}
			for c := 0; c <= MAX_TRI; c++ {
				if tri[c] == rem2 {
					len := (a + 1) + (b + 1) + (c + 1)
					if len <= m {
						blocks = append(blocks, a+1, b+1, c+1)
						for i := len; i < m; i++ {
							blocks = append(blocks, 1)
						}
						return blocks, true
					}
					break
				}
			}
		}
	}

	return nil, false
}

func solve() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	fmt.Fscan(reader, &t)
	for tc := 0; tc < t; tc++ {
		var n, x, y, s int
		fmt.Fscan(reader, &n, &x, &y, &s)

		r := x % y
		q := x / y

		minSum := n * r
		if s < minSum || (s-minSum)%y != 0 {
			fmt.Fprintln(writer, "No")
			continue
		}

		B := (s - minSum) / y
		found := false

		// l is the length of the first block (before first mod, or whole sequence)
		maxL := n
		if q > 0 && B/q < maxL {
			maxL = B / q
		}

		for l := 1; l <= maxL && l <= n; l++ {
			contribution := l*q + tri[l-1]
			if contribution > B {
				break
			}
			C := B - contribution
			m := n - l

			blocks, ok := findPartition(C, m)
			if ok {
				found = true
				fmt.Fprintln(writer, "Yes")
				// Output the sequence
				// First l elements: x, x+y, ...
				for i := 0; i < l; i++ {
					if i > 0 {
						fmt.Fprint(writer, " ")
					}
					fmt.Fprint(writer, x+i*y)
				}
				// Suffix
				for _, blk := range blocks {
					for j := 0; j < blk; j++ {
						if l > 0 || blk > 0 || j > 0 {
							fmt.Fprint(writer, " ")
						}
						fmt.Fprint(writer, r+j*y)
					}
				}
				fmt.Fprintln(writer)
				break
			}
		}

		if !found {
			fmt.Fprintln(writer, "No")
		}
	}
}

func main() {
	solve()
}
```