이것도 XOR해 보시지
시간 제한2초메모리 제한1024 MB
무게가 1부터 k까지 빠짐없이 있는 동전 n개의 무게를 구합니다. 서로 겹치지 않는 두 부분집합 합의 XOR 질의를 최대 n-1번 사용합니다.
문제
동전 수집가 승재는 동전을 무게별로 분류해 보관하고 있었다. 그런데 어디선가 고양이가 나타나 동전을 마구잡이로 섞고는 "이것도 XOR해 보시지!"라는 정체불명의 말만 남기고 사라져 버렸다. 고양이에게 질 수 없던 승재는 직접 만든 XOR-저울로 동전을 다시 분류하기로 한다.
XOR-저울은 양팔 저울을 개조한 것으로, 양쪽의 무게를 각각 잰 뒤 그 XOR값을 반환한다. 하지만 개조 과정에서 문제가 있었는지, 한쪽이라도 비어 있으면 작동하지 않는다.
승재가 수집한 동전에는 몇 가지 규칙이 있다.
- 동전을 1g짜리부터 순서대로 수집했다. 따라서 동전의 최대 무게가 g이면, 인 모든 정수 에 대해 무게가 g인 동전이 존재한다.
- 는 () 꼴이 아니다. 다만 의 정확한 값은 기억하지 못한다.
- 동전의 번호는 번부터 번까지 붙어 있다.
이 조건들을 이용해 승재가 동전을 모두 분류하도록 도와보자.
입력
첫 번째 줄에 동전의 개수 이 주어진다. 동전의 번호는 번부터 번까지이다.
동전의 최대 무게 는 주어지지 않는다. , ,
출력
표준 출력(stdout)으로 다음 형식의 질문을 한 줄에 하나씩 출력하면, 동전 무게 합의 XOR값을 알아낼 수 있다.
- : XOR-저울로 의 값을 출력한다. 는 번 동전의 무게이며, 은 서로 다른 동전의 번호이다.
질문을 출력할 때마다 표준 출력 버퍼를 반드시 flush하고, 표준 입력(stdin)으로 답을 받아야 한다. 그렇지 않으면 시간 초과 또는 런타임 에러를 받는다.
질문에 포함된 번호가 동전 번호의 범위를 벗어나면 틀렸습니다를 받는다.
질문은 최대 번까지 할 수 있으며, 이보다 많이 질문하면 틀렸습니다를 받는다.
최대 번의 질문을 한 뒤, 정답을 표준 출력(stdout)으로 한 번만 출력한다.
- : 모든 동전의 무게를 번호 순서대로 출력한다.
그 다음 표준 출력 버퍼를 반드시 flush하고 프로그램을 종료한다. 이 출력은 질문 횟수에 포함되지 않는다.
힌트
정답을 출력한 후에는 표준 출력 버퍼를 flush해야 한다. 언어별 flush 방법은 다음과 같다.
- C: fflush(stdout)
- C++: std::cout << std::flush
- Java: System.out.flush()
- Python: sys.stdout.flush()