Alma 有许多木板想要锯成碎片。因此,她去了一家最先进的锯木厂,该厂可以自动切割和分类木板。每块木板都可以用一条无限长的 $x$ 轴表示,锯木厂将在以下 $N+1$ 个位置切割木板:
$$ x_1, x_2, \dots , x_N, v $$
其中 $v$ 是用户选择的一个数。然后,所有长度有限的碎片将被排序并由锯木厂输出。Alma 想要知道这些数字 $x_1, x_2, \dots , x_N$,但似乎没有人知道锯木厂内部是什么样子的。因此,她计划通过送入一些精心选择 $v$ 值的木板来推导出这些数字。
有 $N$ 个介于 $1$ 和 $10^9$ 之间的秘密整数 $x_1 < x_2 < \dots < x_N$。请注意,所有这些数字都是互不相同的。你的目标是找到这些数字。你可以向锯木厂发送木板。锯木厂接受一个整数 $v$ 作为输入($1 \leq v \leq 10^9$),并执行以下操作:
- 创建列表 $L = [x_1, x_2, \dots , x_N, v]$。
- 对 $L$ 进行排序。
- 创建列表 $D$,其中对于所有 $i = 1, 2, \dots , N$,有 $D_i = L_{i+1}-L_i$。
- 对 $D$ 进行排序,并返回 $D$ 中的 $N$ 个整数。
你最多可以发送 $N$ 块木板,但在子任务 4 中,你最多可以发送 $N+1$ 块木板。
交互
你的程序首先应当读取两个整数 $N$ 和 $T$($1 \leq N \leq 1000$,$1 \leq T \leq 5$)。$N$ 是你需要寻找的秘密数字的个数,$T$ 是测试组编号。输入 $T$ 的目的是为了让你更容易获得部分分。
然后,你可以开始发送木板。输出一行 ? v 以向锯木厂发送一块带有数字 $v$ 的木板。数字 $v$ 必须满足 $1 \leq v \leq 10^9$。接着,你的程序应当在一行中读取 $N$ 个整数,即数字 $D_1, D_2, \dots , D_N$。请注意,如果 $v$ 等于某个 $x_i$,则 $D_1$ 可以为零。
当你找到数字 $x_1, x_2, \dots , x_N$ 时,你应该输出一行,格式如下:
$$! \; x_1 \; x_2 \; x_3 \; \dots \; x_N$$
然后,你的程序应当终止,且不再输出任何内容。
请确保在每次询问后刷新输出缓冲区,否则可能会导致超时(Time Limit Exceeded)。在 C++ 中,这可以通过例如 cout << flush 或 fflush(stdout); 来实现;在 Python 中可以使用 stdout.flush();;在 Java 中可以使用 System.out.flush()。
子任务
你的解法将在若干个测试组上进行测试,每个测试组值一定的分数。每个测试组包含若干个测试用例。要获得某个测试组的分数,你需要通过该测试组中的所有测试用例。
| 子任务 | 分数 | 数据范围 |
|---|---|---|
| $1$ | $15$ | $N = 1$ |
| $2$ | $15$ | $N = 2$ |
| $3$ | $11$ | $x_i \leq N+1$ |
| $4$ | $37$ | $N \leq 100$,$x_i \leq 10^4$,你最多可以发送 $N+1$ 块木板。 |
| $5$ | $22$ | 无附加限制。 |