← Home
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	t, _ := strconv.Atoi(scanner.Text())

	f := make([]int64, 60)
	sumF := make([]int64, 60)
	f[0] = 1
	f[1] = 1
	sumF[0] = 1
	sumF[1] = 2
	for i := 2; i < 60; i++ {
		f[i] = f[i-1] + f[i-2]
		sumF[i] = sumF[i-1] + f[i]
	}

	for tc := 0; tc < t; tc++ {
		scanner.Scan()
		k, _ := strconv.Atoi(scanner.Text())

		c := make([]int64, k)
		var totalSum int64 = 0
		for i := 0; i < k; i++ {
			scanner.Scan()
			val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
			c[i] = val
			totalSum += val
		}

		m := -1
		for i := 0; i < 60; i++ {
			if sumF[i] == totalSum {
				m = i
				break
			}
		}

		if m == -1 {
			fmt.Println("NO")
			continue
		}

		possible := true
		lastIdx := -1

		for j := m; j >= 0; j-- {
			maxIdx := -1
			var maxVal int64 = -1

			for i := 0; i < k; i++ {
				if i == lastIdx {
					continue
				}
				if c[i] > maxVal {
					maxVal = c[i]
					maxIdx = i
				}
			}

			if maxIdx == -1 || maxVal < f[j] {
				possible = false
				break
			}

			c[maxIdx] -= f[j]
			lastIdx = maxIdx
		}

		if possible {
			fmt.Println("YES")
		} else {
			fmt.Println("NO")
		}
	}
}