```go
package main
import (
"bufio"
"fmt"
"math/bits"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
var t int
fmt.Fscan(in, &t)
for i := 0; i < t; i++ {
var n int
fmt.Fscan(in, &n)
a := make([]int64, n)
var minA, maxA int64 = 1e18, -1
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
if a[i] < minA {
minA = a[i]
}
if a[i] > maxA {
maxA = a[i]
}
}
d := maxA - minA
var k int
if d == 0 {
k = 0
} else {
dd := uint64(d + 1)
k = 64 - bits.LeadingZeros64(dd - 1)
}
fmt.Println(k)
if k > n || k == 0 {
continue
}
arr := make([]int64, n)
copy(arr, a)
xs := make([]int64, 0, k)
rem := k
for st := 0; st < k; st++ {
targ := (int64(1) << uint(rem-1)) - 1
var min0, max0, min1, max1 int64 = 1e18, -1e18, 1e18, -1e18
for _, val := range arr {
b0 := (val + 0) / 2
if b0 < min0 {
min0 = b0
}
if b0 > max0 {
max0 = b0
}
b1 := (val + 1) / 2
if b1 < min1 {
min1 = b1
}
if b1 > max1 {
max1 = b1
}
}
span0 := max0 - min0
span1 := max1 - min1
p := -1
if span0 <= targ {
p = 0
} else if span1 <= targ {
p = 1
}
xs = append(xs, int64(p))
for i := 0; i < n; i++ {
arr[i] = (arr[i] + int64(p)) / 2
}
rem--
}
for i, x := range xs {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(x)
}
fmt.Println()
}
}
```