← Home
package main

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

func gcd(a, b int64) int64 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func getLcm(n int) int64 {
	if n <= 1 {
		return 1
	}
	l := int64(1)
	for i := int64(2); i <= int64(n-1); i++ {
		l = (l / gcd(l, i)) * i
		if l > 2000000000 {
			return 2000000001
		}
	}
	return l
}

func main() {
	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 int
		fmt.Fscan(reader, &n)

		a := make([]int64, n)
		var maxA int64 = 0
		var sumA int64 = 0

		for i := 0; i < n; i++ {
			fmt.Fscan(reader, &a[i])
			sumA += a[i]
			if a[i] > maxA {
				maxA = a[i]
			}
		}

		if n == 1 {
			fmt.Fprintln(writer, sumA)
			continue
		}

		d := make([]int64, n)
		var sumD int64 = 0
		for i := 0; i < n; i++ {
			d[i] = maxA - a[i]
			sumD += d[i]
		}

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

		L := getLcm(n)

		terminal := true
		for i := 0; i < n; i++ {
			if d[i]%L != 0 {
				terminal = false
				break
			}
		}
		if terminal && sumD%int64(n) != 0 {
			terminal = false
		}
		if terminal {
			fmt.Fprintln(writer, sumA)
			continue
		}

		trapped := true
		for i := 0; i < n-1; i++ {
			if d[i]%L != 0 {
				trapped = false
				break
			}
		}
		if trapped && d[n-1]%L != L-1 {
			trapped = false
		}
		if trapped && sumD%int64(n) != int64(n-1) {
			trapped = false
		}
		if trapped {
			fmt.Fprintln(writer, sumA-1)
			continue
		}

		fmt.Fprintln(writer, -1)
	}
}