이 문제는 인터랙티브 문제입니다. 각 줄을 출력한 후에는 반드시 출력 버퍼를 비워야(flush) 합니다. C++에서는 cout << flush, Java에서는 System.out.flush(), Python에서는 sys.stdout.flush()를 사용할 수 있습니다. 상호작용 섹션의 지침을 엄격히 따라야 하며, 그렇지 않으면 오답(Wrong Answer), 시간 초과(Time Limit Exceeded) 등의 판정을 받을 수 있습니다.
모든 문제들이 신화 속 드워프를 주인공으로 삼고 있으니, 이제는 실질적인 무언가에 대해 생각해 볼 가치가 있을 것입니다.
$[0, 2^N - 1]$ 범위의 정수로 이루어진 길이 $N$의 숨겨진 수열 $A$가 있습니다. 당신의 과제는 제한된 횟수의 질의를 사용하여 이 수열을 복원하는 것입니다. 각 질의마다 $[0, 2^N - 1]$ 범위의 원소를 갖는 길이 $N$의 수열 $B$를 제시합니다. 응답은 다음과 같이 계산됩니다:
- 수열 $C$가 생성되며, $C$의 $i$번째 원소는 $A$와 $B$의 $i$번째 원소의 비트 XOR(배타적 논리합)입니다. XOR 연산은 $\oplus$로 표기합니다.
- 집합 $S$는 $C$의 원소들의 부분집합을 XOR하여 얻을 수 있는 모든 값들의 집합으로 구성됩니다. 특히, 공집합에 대한 XOR 값은 $0$입니다.
- 질의에 대한 답은 $|S|$입니다.
예를 들어, $A = (1, 4, 3)$이고 $B = (0, 4, 7)$이면, $C = (1 \oplus 0, 4 \oplus 4, 3 \oplus 7) = (1, 0, 4)$이고 $S = \{0, 1, 4, 5\}$이므로 답은 $4$입니다.
두 수 $x$와 $y$의 비트 XOR은 $x$와 $y$ 중 정확히 하나의 수에서만 비트 $i$가 켜져 있을 때 그리고 그때에만 비트 $i$가 켜집니다. 예를 들어, $5 \oplus 3 = (101)_2 \oplus (011)_2 = (110)_2 = 6$입니다. C++와 Python에서 XOR 연산자는 ^입니다.
상호작용
수열 $A$는 처음에 고정되어 있으며 수행하는 질의에 따라 변하지 않습니다.
먼저 하나의 정수 $1 \le N \le 60$이 포함된 한 줄을 읽습니다. 그런 다음 질의를 할 수 있습니다.
질의를 하려면 ? 뒤에 $[0, 2^N - 1]$ 범위의 정수 $N$개를 공백으로 구분하여 한 줄에 출력합니다. 그에 대한 응답으로 답이 되는 정수 하나를 읽습니다.
준비가 되면 ! 뒤에 숨겨진 수열의 정수 $N$개를 출력합니다. 그런 다음 프로그램은 추가 출력 없이 종료되어야 합니다.
각 질의 후와 정답을 출력한 후에는 반드시 출력을 비워야(flush) 합니다. 숫자와 ?, ! 기호 사이에는 공백을 두어야 합니다.
예제
예제 입력 1
3 4 8
예제 출력 1
? 1 2 3 ? 0 0 0 ! 1 3 4
노트
예제 상호작용에 대한 설명:
$N = 3$
질의 ? 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\}$, 답은 $4$입니다.
질의 ? 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\}$, 답은 $8$입니다.
출력 ! 1 3 4: 숨겨진 수열은 $A = (1, 3, 4)$입니다.
로컬 테스트
Files 섹션에서 예제 테스트와 채점기 grader.cpp가 포함된 B.zip을 찾을 수 있습니다. 솔루션을 테스트하려면 컴파일한 후 컴파일된 ./grader에 테스트 이름과 실행 파일을 전달하세요:
./grader [test] [executable]
예시: ./grader 0b.in ./abc
예제 채점기는 공식 채점기와 완전히 동일하게 동작한다고 보장되지 않습니다. 그러나 둘 다 적응형(adaptive)이 아닙니다.