← Home
package main

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

type FastScanner struct {
	r   *bufio.Reader
	buf []byte
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) NextInt() int64 {
	sign := int64(1)
	val := int64(0)
	c, _ := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = fs.r.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int64(c-'0')
		c, _ = fs.r.ReadByte()
	}
	return val * sign
}

type Pair struct {
	sum int64
	i   int32
	j   int32
}
type Query struct {
	sum int64
	A   int32
	B   int32
	w   int16
}

type Fenwick struct {
	n   int
	t   []int32
	ver []int32
	cur int32
}

func NewFenwick(n int) *Fenwick {
	return &Fenwick{
		n:   n,
		t:   make([]int32, n+2),
		ver: make([]int32, n+2),
		cur: 1,
	}
}
func (f *Fenwick) Reset() {
	f.cur++
}
func (f *Fenwick) add(pos int, delta int32) {
	for p := pos; p <= f.n; p += p & -p {
		if f.ver[p] != f.cur {
			f.t[p] = 0
			f.ver[p] = f.cur
		}
		f.t[p] += delta
	}
}
func (f *Fenwick) sum(pos int) int32 {
	var res int32 = 0
	for p := pos; p > 0; p -= p & -p {
		if f.ver[p] == f.cur {
			res += f.t[p]
		}
	}
	return res
}

func main() {
	fs := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	t := int(fs.NextInt())
	for ; t > 0; t-- {
		n := int(fs.NextInt())
		a := make([]int64, n)
		for i := 0; i < n; i++ {
			a[i] = fs.NextInt()
		}
		pref := make([]int64, n+1)
		for i := 0; i < n; i++ {
			pref[i+1] = pref[i] + a[i]
		}

		// Build pairs (i,j) with sums K = pref[i] + pref[j]
		nPairs := (n + 1) * n / 2
		pairs := make([]Pair, 0, nPairs)
		for i := 0; i <= n-1; i++ {
			pi := pref[i]
			for j := i + 1; j <= n; j++ {
				pairs = append(pairs, Pair{sum: pi + pref[j], i: int32(i), j: int32(j)})
			}
		}

		// Build queries
		// For y in [1..n-1]
		// y==t: K=2*pref[y], A=y-1, B=y+1, w=1
		// y<t:  K=pref[y]+pref[t], A=y-1, B=t+1, w=2
		nQueries := (n - 1) * n / 2
		queries := make([]Query, 0, nQueries)
		for y := 1; y <= n-1; y++ {
			K := pref[y] * 2
			queries = append(queries, Query{sum: K, A: int32(y - 1), B: int32(y + 1), w: 1})
			for t2 := y + 1; t2 <= n-1; t2++ {
				K2 := pref[y] + pref[t2]
				queries = append(queries, Query{sum: K2, A: int32(y - 1), B: int32(t2 + 1), w: 2})
			}
		}

		sort.Slice(pairs, func(i, j int) bool {
			if pairs[i].sum != pairs[j].sum {
				return pairs[i].sum < pairs[j].sum
			}
			if pairs[i].i != pairs[j].i {
				return pairs[i].i < pairs[j].i
			}
			return pairs[i].j < pairs[j].j
		})
		sort.Slice(queries, func(i, j int) bool {
			if queries[i].sum != queries[j].sum {
				return queries[i].sum < queries[j].sum
			}
			if queries[i].A != queries[j].A {
				return queries[i].A < queries[j].A
			}
			return queries[i].B < queries[j].B
		})

		var ansC int64 = 0
		fw := NewFenwick(n + 2)
		pPtr := 0
		qPtr := 0
		for pPtr < len(pairs) {
			curK := pairs[pPtr].sum
			pEnd := pPtr
			for pEnd < len(pairs) && pairs[pEnd].sum == curK {
				pEnd++
			}
			for qPtr < len(queries) && queries[qPtr].sum < curK {
				qPtr++
			}
			qEnd := qPtr
			for qEnd < len(queries) && queries[qEnd].sum == curK {
				qEnd++
			}
			if qEnd > qPtr {
				fw.Reset()
				var inserted int32 = 0
				p := pPtr
				for qi := qPtr; qi < qEnd; qi++ {
					A := queries[qi].A
					for p < pEnd && pairs[p].i <= A {
						j := int(pairs[p].j)
						pos := j + 1
						fw.add(pos, 1)
						inserted++
						p++
					}
					B := int(queries[qi].B)
					cnt := inserted - fw.sum(B)
					ansC += int64(cnt) * int64(queries[qi].w)
				}
			}
			pPtr = pEnd
			qPtr = qEnd
		}

		var total1 int64 = 0
		for d := 1; d <= n-1; d++ {
			total1 += int64(d) * int64(n-d)
		}
		ans := total1 - ansC
		if ans < 0 {
			ans = 0
		}
		// Print answer
		out.WriteString(Int64ToString(ans))
		out.WriteByte('\n')
	}
}

func Int64ToString(x int64) string {
	if x == 0 {
		return "0"
	}
	var b [32]byte
	i := len(b)
	neg := x < 0
	if neg {
		x = -x
	}
	for x > 0 {
		i--
		b[i] = byte('0' + x%10)
		x /= 10
	}
	if neg {
		i--
		b[i] = '-'
	}
	return string(b[i:])
}