이것도 XOR해 보시지

아직 제출이 없습니다시간 제한2초메모리 제한1024 MB

문제

동전 수집가 승재는 동전을 무게별로 분류해 가지고 있었다. 하지만 어디선가 고양이가 나타나 동전을 마구잡이로 섞으며 "이것도 XOR해 보시지!"라는 정체불명의 대사만 남기고 사라져버렸다! 한낱 고양이에게 질 수 없었던 승재는 직접 만든 XOR-저울을 이용해 동전을 다시 분류하기로 한다.

XOR-저울은 양팔 저울을 개조한 것으로, 양쪽의 무게를 각각 잰 후 그 XOR값을 반환한다. 하지만, 개조 과정에서 문제가 있었는지 한쪽이라도 비어있다면 작동하지 않는다.

승재가 수집한 동전에는 몇 가지 규칙이 있다.

  1. 동전을 11g짜리부터 순서대로 수집했기 때문에, 동전의 최대 무게가 kkg이라면 1pk1 \leq p \leq k인 모든 정수 pp에 대해 무게가 ppg인 동전이 존재한다.
  2. kk는 2×2m2(m2)2 \times 2^m-2(m \geq 2)가 아니라는 조건을 만족한다. 하지만 멍청하게도 kk값이 정확히 몇인지는 기억하지 못한다.
  3. 동전의 번호는 00번부터 n1n-1번까지로 라벨링이 되어있다.

위 조건들을 이용해 승재를 도와 동전을 모두 분류해보자.

입력

첫 번째 줄에 동전의 개수 nn이 주어진다. (kn10,000)(k \leq n \leq 10\\,000) 이때 동전의 번호는 00번부터 n1n-1번까지이다.

동전의 최대 무게 kk는 주어지지 않는다. (3k1,000(3 \leq k \leq 1\\,000, k2×2m2k \neq 2 \times 2^m-2, m2)m \geq 2)

출력

다음을 표준 출력 스트림(stdout)으로 한 줄에 출력하여, 동전 무게의 합의 xor 값을 알아낼 수 있다.

  • ?? a_0a\_0 \cdots a_i1a\_{i-1} 1-1 b_0b\_0 \cdots b_j1b\_{j-1} 1-1: XOR-저울을 사용해 (c_a_0(c\_{a\_0} ++ \cdots ++ c_a_i1)c\_{a\_{i-1}}) \oplus (c_b_0(c\_{b\_0} ++ \cdots ++ c_b_j1)c\_{b\_{j-1}})을 출력한다. c_qc\_qqq번째 동전의 무게이며, a_0,a\_0, ,\cdots, a_i1,a\_{i-1}, b_0,b\_0, ,\cdots, b_j1b\_{j-1}은 서로 다른 동전의 번호이다. (i1,(i \geq 1, j1,j \geq 1, i+jn)i+j \leq n)

각 질문을 출력한 후에는 반드시 표준 출력 버퍼를 flush 해야 하고, 표준 입력 스트림(stdin)을 통해 질문에 대한 답을 입력받아야 한다. 그렇지 않으면, 시간 초과 또는 런타임에러를 받는다.

질문하는 a_0,a\_0, ,\cdots, a_i1,a\_{i-1}, b_0,b\_0, ,\cdots, b_j1b\_{j-1}의 범위가 동전 번호를 벗어나는 경우, 틀렸습니다를 받는다.

질문은 최대 n1n-1번 할 수 있고, 이보다 더 많이 질문을 하면 틀렸습니다를 받는다.

최대 n1n-1번의 질문을 이용해, 정답을 아래의 표준 출력 스트림(stdout)을 이용해 한 번만 출력한다.

  • !! c_0c\_0 \cdots c_n1c\_{n-1}: 모든 동전의 무게를 순서대로 출력한다.

그 후 반드시 표준 출력 버퍼를 flush해야 하고, 프로그램을 종료한다. 이것은 질문 횟수에 포함되지 않는다.

힌트

출력 후에는 표준 출력 버퍼를 flush해 주어야 한다. 언어 별로 표준 출력 버퍼를 flush하는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()