Este problema es interactivo. Después de imprimir cada línea, debes vaciar el búfer de salida (flush). Puedes usar cout << flush en C++, System.out.flush() en Java y sys.stdout.flush() en Python. Debes seguir estrictamente las instrucciones de la sección Interacción; de lo contrario, podrías recibir veredictos como respuesta incorrecta (wrong answer), tiempo límite excedido (time limit exceeded) u otros.
Dado que todas las tareas tienen a enanos míticos como protagonistas, tal vez valga la pena pensar finalmente en algo tangible.
Hay una secuencia oculta $A$ de longitud $N$ que consta de enteros en el rango $[0, 2^N - 1]$. Tu tarea es recuperarla utilizando un número limitado de consultas. En cada consulta, proporcionas una secuencia $B$ de longitud $N$ con elementos en el rango $[0, 2^N - 1]$. La respuesta se calcula de la siguiente manera:
- Se crea la secuencia $C$ donde el $i$-ésimo elemento de $C$ es el xor bit a bit (bitwise xor) de los $i$-ésimos elementos de $A$ y $B$. Denotamos el xor por $\oplus$.
- El conjunto $S$ se construye como el conjunto de todos los valores que se pueden obtener aplicando xor a algún subconjunto de elementos de $C$. En particular, para el subconjunto vacío, el xor es $0$.
- La respuesta a la consulta es $|S|$.
Por ejemplo, si $A = (1, 4, 3)$ y $B = (0, 4, 7)$, entonces $C = (1 \oplus 0, 4 \oplus 4, 3 \oplus 7) = (1, 0, 4)$ y $S = \{0, 1, 4, 5\}$, por lo que la respuesta es $4$.
El xor bit a bit de dos números $x$ e $y$ tiene el bit $i$ activado si y solo si exactamente uno de $x$ e $y$ tiene el bit $i$ activado. Por ejemplo, $5 \oplus 3 = (101)_2 \oplus (011)_2 = (110)_2 = 6$. En C++ y Python, el xor es el operador ^.
Interacción
La secuencia $A$ está fija al principio y no depende de las consultas realizadas.
Primero, lee una línea que contiene un entero $1 \le N \le 60$. Luego puedes hacer consultas.
Para hacer una consulta, imprime una línea que contenga ? seguido de $N$ enteros en el rango $[0, 2^N - 1]$. En respuesta, lee un entero que es la respuesta.
Cuando estés listo, imprime ! seguido de los $N$ enteros de la secuencia oculta. Luego tu programa debe terminar sin más salidas.
Recuerda vaciar la salida (flush) después de cada consulta y después de escribir la respuesta. Pon espacios entre los números y los símbolos ?, !.
Ejemplos
Entrada 1
3 4 8
Salida 1
? 1 2 3 ? 0 0 0 ! 1 3 4
Nota
La explicación de la interacción de ejemplo:
$N = 3$
Consulta ? 1 2 3: $B = (1, 2, 3)$, $C = (1 \oplus 1, 3 \oplus 2, 4 \oplus 3) = (0, 1, 7)$, $S = \{0, 1, 6, 7\}$, la respuesta es $4$.
Consulta ? 0 0 0: $B = (0, 0, 0)$, $C = (1 \oplus 0, 3 \oplus 0, 4 \oplus 0) = (1, 3, 4)$, $S = \{0, 1, \dots, 7\}$, la respuesta es $8$.
Salida ! 1 3 4: La secuencia oculta es $A = (1, 3, 4)$.
Pruebas locales
En la sección Files puedes encontrar B.zip que contiene pruebas de ejemplo y un evaluador grader.cpp. Para probar tu solución, compílala y luego pasa el nombre de la prueba y tu ejecutable al ./grader compilado:
./grader [test] [executable]
Por ejemplo: ./grader 0b.in ./abc
No se garantiza que el evaluador de ejemplo se comporte de manera idéntica al oficial. Sin embargo, ninguno de los dos es adaptativo.