순간이동 경로

시간 제한1초메모리 제한128 MB

요약
2^n개의 행성과 1부터 2^n-1까지 각 거리별로 하나씩 있는 텔레포트를 이용해 k에서 출발하여 방문 가능한 서로 다른 행성 수를 최대화하는 순서를 구하고 부호가 있는 텔레포트 번호열을 출력합니다.
난이도

어려움10점 중 8점

유형
수학, 그리디, 비트 연산, 시뮬레이션
정답자
아직 제출이 없습니다

문제

행성계에는 0부터 2^n - 1까지 번호가 붙은 2^n개의 행성이 있다. 행성들은 번호 순서대로 한 직선 위에 놓여 있다고 생각한다.

스탄초는 처음에 우주 정거장을 통해 번호 k인 행성에 도착한다. 또한 1부터 2^n - 1까지 번호가 붙은 순간이동 장치가 하나씩 있다. 번호가 t인 장치는 최대 한 번만 사용할 수 있으며, 현재 행성 번호가 m일 때 존재한다면 m + t 또는 m - t인 행성으로 이동할 수 있다.

스탄초가 서로 다른 행성을 가능한 한 많이 방문하도록 순간이동 장치의 사용 순서를 구하라. 처음 도착한 행성 k는 방문 수에 포함하지 않는다.

입력

표준 입력 한 줄에 양의 정수 n과 정수 k가 공백으로 구분되어 주어진다.

출력

첫째 줄에 스탄초가 행성 k를 제외하고 방문할 수 있는 행성의 최대 개수 p를 출력한다.

둘째 줄에는 사용할 p개의 순간이동 장치 번호를 사용 순서대로 출력한다. 더 큰 번호의 행성에서 더 작은 번호의 행성으로 이동하는 장치는 음수로 출력한다.

가능한 사용 순서가 여러 가지라면 그중 아무거나 출력해도 된다.

제한

  • 1 <= n <= 20
  • 0 <= k <= 2^n - 1

예제1

  1. 예제 1

    입력
    2 2
    
    예상 출력
    3
    -1 2 -3