← Home
For problem statement at 1000-1999/1700-1799/1720-1729/1728/problemF.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1720-1729/1728/verifierF.go ends with All tests passed can you fix the verifier? package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	a := make([]int, n)
	nxtMult := make([]int, 1000005)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
		nxtMult[a[i]] = 1
	}

	M := make([]int, n)
	isMatched := make(map[int]bool)

	lastVisit := make([]int, 1000005)
	lastChecked := make([]int, 1000005)
	for j := range lastVisit {
		lastVisit[j] = -1
		lastChecked[j] = -1
	}

	q := make([]int, 0, n)
	inS := make([]bool, n)
	parent := make([]int, n)

	for i := 0; i < n; i++ {
		q = q[:0]
		for j := 0; j <= i; j++ {
			inS[j] = false
			parent[j] = -1
		}

		q = append(q, i)
		inS[i] = true

		head := 0
		for head < len(q) {
			u := q[head]
			head++

			valU := a[u]
			if lastVisit[valU] == i {
				continue
			}
			lastVisit[valU] = i

			for v := 0; v < i; v++ {
				if !inS[v] && M[v]%valU == 0 {
					inS[v] = true
					parent[v] = u
					q = append(q, v)
				}
			}
		}

		bestX := -1
		bestU := -1

		for _, u := range q {
			val := a[u]
			if lastChecked[val] == i {
				continue
			}
			lastChecked[val] = i

			k := nxtMult[val]
			for isMatched[k*val] {
				k++
			}
			nxtMult[val] = k
			cand := k * val

			if bestX == -1 || cand < bestX {
				bestX = cand
				bestU = u
			}
		}

		curr := bestU
		valToGive := bestX

		for curr != i {
			p := parent[curr]
			nextValToGive := M[curr]
			M[curr] = valToGive
			valToGive = nextValToGive
			curr = p
		}
		M[i] = valToGive
		isMatched[bestX] = true
	}

	var totalSum int64
	for _, val := range M {
		totalSum += int64(val)
	}

	fmt.Println(totalSum)
}