← Home
```go
package main

import (
	"fmt"
	"os"
)

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	var t int
	fmt.Scan(&t)
	const N = 100000
	const MAXW = 100000
	for test := 0; test < t; test++ {
		// First query: ? N 1 1 ... 1
		fmt.Printf("? %d", N)
		for i := 0; i < N; i++ {
			fmt.Printf(" 1")
		}
		fmt.Printf("\n")
		os.Stdout.Sync()
		var r int
		fmt.Scan(&r)
		if r == -1 {
			os.Exit(0)
		}
		var lo, hi int
		if r == 1 {
			lo = N
			hi = N
		} else if r > 1 {
			lo = (N + r - 1) / r
			hi = (N - 1) / (r - 1)
			if hi > MAXW {
				hi = MAXW
			}
		} else {
			// impossible
			continue
		}
		if lo > hi {
			// impossible
			continue
		}
		if lo == hi {
			fmt.Printf("! %d\n", lo)
			os.Stdout.Sync()
			continue
		}
		// Second query
		S := hi - lo + 1
		M := S
		T := make([]int, M)
		for j := 0; j < M; j++ {
			T[j] = lo + j
		}
		A := make([]int, M)
		B := make([]int, M)
		A[0] = 1
		B[0] = T[0] - 1
		for j := 0; j < M-1; j++ {
			minA := hi - T[j] + 1
			upper := T[j+1] - 1
			needed := T[j] - B[j]
			if needed < 1 {
				needed = 1
			}
			a := max(minA, needed)
			if a > upper || a > lo {
				// fail, but shouldn't happen
				continue
			}
			A[j+1] = a
			B[j+1] = T[j+1] - a
		}
		// Build words
		fmt.Printf("? %d", 2*M)
		for j := 0; j < M; j++ {
			fmt.Printf(" %d %d", A[j], B[j])
		}
		fmt.Printf("\n")
		os.Stdout.Sync()
		var r2 int
		fmt.Scan(&r2)
		if r2 == -1 {
			os.Exit(0)
		}
		k := 2*M - r2
		w := lo + (k - 1)
		fmt.Printf("! %d\n", w)
		os.Stdout.Sync()
	}
}
```