← Home
For problem statement at 0-999/800-899/880-889/888/problemE.txt this is a correct solution, but verifier at 0-999/800-899/880-889/888/verifierE.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt64() int64 {
	for fs.idx < len(fs.data) {
		c := fs.data[fs.idx]
		if c != ' ' && c != '\n' && c != '\r' && c != '\t' {
			break
		}
		fs.idx++
	}
	var sign int64 = 1
	if fs.idx < len(fs.data) && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	var n int64
	for fs.idx < len(fs.data) {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		n = n*10 + int64(c-'0')
		fs.idx++
	}
	return n * sign
}

func gen(arr []int64, m int64, idx int, cur int64, res *[]int64) {
	if idx == len(arr) {
		*res = append(*res, cur)
		return
	}
	gen(arr, m, idx+1, cur, res)
	gen(arr, m, idx+1, (cur+arr[idx])%m, res)
}

func main() {
	fs := NewFastScanner()
	n := int(fs.NextInt64())
	m := fs.NextInt64()

	a := make([]int64, n)
	for i := 0; i < n; i++ {
		a[i] = fs.NextInt64() % m
	}

	mid := n / 2
	leftArr := a[:mid]
	rightArr := a[mid:]

	leftSums := make([]int64, 0, 1<<len(leftArr))
	rightSums := make([]int64, 0, 1<<len(rightArr))

	gen(leftArr, m, 0, 0, &leftSums)
	gen(rightArr, m, 0, 0, &rightSums)

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

	var ans int64
	for _, x := range leftSums {
		target := m - 1 - x
		pos := sort.Search(len(rightSums), func(i int) bool { return rightSums[i] > target })
		if pos > 0 {
			v := x + rightSums[pos-1]
			if v > ans {
				ans = v
			}
		}
	}

	fmt.Println(ans)
}