← Home
For problem statement at 1000-1999/1400-1499/1490-1499/1497/problemE2.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1490-1499/1497/verifierE2.go ends with All 100 tests passed can you fix the verifier? ```go
package main

import (
	"io"
	"os"
	"strconv"
)

var data []byte
var ptr int
var primes []int
var memo map[int]int

func nextInt() int {
	for ptr < len(data) {
		b := data[ptr]
		if b >= '0' && b <= '9' {
			break
		}
		ptr++
	}
	n := 0
	for ptr < len(data) {
		b := data[ptr]
		if b < '0' || b > '9' {
			break
		}
		n = n*10 + int(b-'0')
		ptr++
	}
	return n
}

func buildPrimes(limit int) []int {
	isComp := make([]bool, limit+1)
	res := make([]int, 0, 500)
	for i := 2; i <= limit; i++ {
		if !isComp[i] {
			res = append(res, i)
			if i*i <= limit {
				for j := i * i; j <= limit; j += i {
					isComp[j] = true
				}
			}
		}
	}
	return res
}

func kernel(x int) int {
	if v, ok := memo[x]; ok {
		return v
	}
	y := x
	res := 1
	for _, p := range primes {
		if p*p > y {
			break
		}
		if y%p == 0 {
			odd := 0
			for y%p == 0 {
				y /= p
				odd ^= 1
			}
			if odd == 1 {
				res *= p
			}
		}
	}
	if y > 1 {
		res *= y
	}
	memo[x] = res
	return res
}

func main() {
	data, _ = io.ReadAll(os.Stdin)
	primes = buildPrimes(3162)
	memo = make(map[int]int, 300000)
	memo[1] = 1

	t := nextInt()
	out := make([]byte, 0, t*4)

	var arr []int
	var nxt []int
	var dp []int

	for ; t > 0; t-- {
		n := nextInt()
		k := nextInt()

		if cap(arr) < n {
			arr = make([]int, n)
		} else {
			arr = arr[:n]
		}

		id := make(map[int]int, n*2)
		m := 0
		for i := 0; i < n; i++ {
			v := kernel(nextInt())
			if idx, ok := id[v]; ok {
				arr[i] = idx
			} else {
				id[v] = m
				arr[i] = m
				m++
			}
		}

		stride := k + 1
		size := (n + 1) * stride

		if cap(nxt) < size {
			nxt = make([]int, size)
		} else {
			nxt = nxt[:size]
		}
		if cap(dp) < size {
			dp = make([]int, size)
		} else {
			dp = dp[:size]
		}

		for c := 0; c <= k; c++ {
			cnt := make([]int, m)
			dup, r := 0, 0
			base := 0
			for l := 0; l < n; l++ {
				for r < n {
					v := arr[r]
					if cnt[v] > 0 {
						if dup == c {
							break
						}
						dup++
					}
					cnt[v]++
					r++
				}
				nxt[base+c] = r
				v := arr[l]
				if cnt[v] > 1 {
					dup--
				}
				cnt[v]--
				base += stride
			}
			nxt[n*stride+c] = n
		}

		baseN := n * stride
		for j := 0; j <= k; j++ {
			dp[baseN+j] = 0
		}

		for i, base := n-1, (n-1)*stride; i >= 0; i, base = i-1, base-stride {
			for j := 0; j <= k; j++ {
				best := n + 1
				for c := 0; c <= j; c++ {
					ni := nxt[base+c]
					v := dp[ni*stride+j-c] + 1
					if v < best {
						best = v
					}
				}
				dp[base+j] = best
			}
		}

		out = strconv.AppendInt(out, int64(dp[k]), 10)
		out = append(out, '\n')
	}

	_, _ = os.Stdout.Write(out)
}
```