XOR 기계
시간 제한1초메모리 제한1024 MB
각 버튼을 누를 때마다 누적 XOR 값이 바뀔 때, 서로 다른 값의 개수를 최대로 만드는 최소 길이의 버튼 수열을 구하고 그중 사전순으로 가장 앞서는 것을 출력한다.
문제
cs71107은 신기한 기계를 발견했다. 기계에는 번부터 번까지 번호가 붙어있는 개의 버튼과 수를 표시하는 장치가 하나 있다. 처음에는 이 표시되어 있다.
cs71107은 버튼을 누를 때마다 표시되는 수가 특정한 규칙에 따라 변한다는 사실을 알아냈다. 기존에 표시되는 수를 라고 할 때, 번 버튼을 누르면 표시되는 수가 , 즉 와 의 bitwise XOR로 변한다는 사실을 알아냈다.
버튼을 몇 개씩 눌러보던 중 cs71107은 표시되는 수로 서로 다른 수를 최대한 많이 만들고 싶다고 생각했다. 단, 아무 방법으로만 만들면 재미없다고 생각해서 버튼을 최대한 적게, 또 그런 방법이 여러 개라면 누른 버튼의 번호로 이루어진 수열이 사전 순으로 가장 앞선 방법으로 누르고 싶었다.
안타깝게도 cs71107은 이 문제를 해결할 수 있을 정도로 똑똑하지 않다. 여러분이 cs71107을 도와서 문제를 해결해 주자!
입력
첫 번째 줄에 이 주어진다.
두 번째 줄에 개의 정수 이 공백으로 구분되어 주어진다.
출력
첫째 줄에 서로 다른 수를 최대한 많이 만들기 위해 버튼을 눌러야 하는 최소 횟수인 를 출력한다.
두 번째 줄부터 개의 줄을 출력한다. 이 중 번째 줄에는 번째로 눌러야 하는 버튼의 번호를 출력한다. 가능한 답이 여럿 있으면 사전 순으로 가장 앞서는 답을 출력한다.
제한
- 입력으로 주어지는 모든 수는 정수이다.
힌트
- 와 의 bitwise XOR인 는, 2진법으로 표현했을 때 와 의 번째 자리가 같으면 의 번째 자리가 이고, 서로 다르면 이 되도록 계산한다.
- 수열 가 보다 사전 순으로 앞선다는 의미는, 이상 이하의 정수 가 존재해서, 이고, 임을 의미한다.