← Home
package main

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

const M = 400000

func precompute() ([]int, []int) {
	cnt := make([]int, M+2)
	for d := 2; d*2 <= M; d++ {
		for m := d * 2; m <= M; m += d {
			cnt[m]++
		}
	}

	start := make([]int, M+2)
	for i := 1; i <= M+1; i++ {
		start[i] = start[i-1] + cnt[i-1]
	}

	all := make([]int, start[M+1])
	pos := make([]int, M+1)
	copy(pos, start[:M+1])

	for d := 2; d*2 <= M; d++ {
		for m := d * 2; m <= M; m += d {
			all[pos[m]] = d
			pos[m]++
		}
	}

	f := make([]int, M+1)
	for y := 2; y <= M; y++ {
		if cnt[y] == 0 {
			f[y] = y
		} else {
			best := 0
			for i := start[y]; i < start[y+1]; i++ {
				v := f[y-all[i]]
				if v > best {
					best = v
				}
			}
			f[y] = best
		}
	}

	return cnt, f
}

func main() {
	cnt, f := precompute()

	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	t := nextInt()
	var out bytes.Buffer

	for ; t > 0; t-- {
		n := nextInt()
		a := make([]int, n)
		prime := 0
		bad := false

		for i := 0; i < n; i++ {
			x := nextInt()
			a[i] = x
			if cnt[x] == 0 {
				if prime == 0 {
					prime = x
				} else {
					bad = true
				}
			}
		}

		if bad {
			out.WriteString("-1\n")
			continue
		}

		if prime == 0 {
			out.WriteString("2\n")
			continue
		}

		ok := true
		for _, x := range a {
			if x == prime {
				continue
			}
			if cnt[x] == 0 || f[x] < prime {
				ok = false
				break
			}
		}

		if ok {
			out.WriteString(strconv.Itoa(prime))
			out.WriteByte('\n')
		} else {
			out.WriteString("-1\n")
		}
	}

	os.Stdout.Write(out.Bytes())
}