이진수 변환

x0에서 시작해 이진수에서 1 비트 일부를 0으로 바꾸는 변환을 N번 해서 0에 도달하며, 인접한 항의 차이의 최댓값과 최솟값의 차이를 최소로 만든다.

어려움8비트 연산그리디수학구현아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

당신에게 자연수 x0와 N이 주어졌다. 지금부터 당신은 이 자연수 x0를 N번의 '변환'을 통해 0으로 바꿀 것이다. 변환이란, 양의 정수를 이진법으로 표기하여, 1개 이상의 1을 0으로 바꾸는 작업이다. 예를 들어 9를 이진법으로 나타내면 1001(2)인데, 9는 0(0000(2)), 1(0001(2)), 또는 8(1000(2))로 변환될 수 있다. 바뀐 자릿수는 밑줄로 표기되었다. 여러분의 목표는 xi를 변환하여 x**i+1를 만드는 과정을 반복해, xN을 0으로 만드는 것이다.

위 조건을 만족하는 수열 X = x0, x1, x2, ..., xN는 존재하지 않을 수도 있지만, 여러 개가 존재할 수도 있다. 만약 존재한다면, 각 수열별로 인접한 원소들의 차들의 집합 D(X) = {x0-x1, x1-x2, ..., xN-1-x**N}를 정의하자. 이 집합의 원소들의 최대값과 최소값의 차이를 최소화하도록, 수열 X를 만들고자 한다. 즉, 가능한 모든 수열 Xi 중 (D(Xi)에 속한 원소의 최댓값 - D(Xi)에 속한 원소의 최솟값)이 최소가 되는 Xi를 찾고자 한다.

이상해보일 수 있는 문제지만, 당신은 대답해야 한다. 과연 1초안에 답할 수 있을까?

입력

첫 번째 줄에 변환할 자연수와 변환 횟수를 의미하는 두 자연수 x0과 N이 공백으로 구분되어 주어진다. (1 ≤ x0 ≤ 1016, 1 ≤ N ≤ 50)

출력

만약 조건을 만족하는 수열이 존재하지 않으면 첫 번째 줄에 -1을 출력한다.

조건을 만족하는 수열이 존재한다면, 수열의 원소를 의미하는 N개의 정수 x1, x2, ..., xN을 공백으로 구분하여 출력한다.

조건을 만족하는 수열이 여러 개 존재한다면, 아무 것이나 출력해도 좋다.