비밀번호

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

요약
각 항의 1의 개수가 주어질 때 1부터 M 사이 수로 수열을 만들어 차이가 1인 이웃 쌍을 최대로 하고 사전순 최소를 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 그리디, 비트 연산
정답자
아직 제출이 없습니다

문제

우람이는 11과 MM 사이의 수 NN개로 이루어진 비밀번호를 가지고 있다. 해당 비밀번호를 기억하기 쉽게 하기 위해 각 수를 2진법으로 나타냈을때 1의 개수를 적어두었다. 그 이후 우람이는 비밀번호를 잊어버렸다.

우람이는 비밀번호의 이웃한 수의 차이가 1인 수를 쓰는 것을 좋아한다. 각 수를 이진법으로 나타냈을 때 1의 개수가 주어졌을 때 이웃한 수 중에 차이가 1인 수의 쌍이 가장 많은 비밀번호 수열을 찾아서 우람이를 도와주자. 단, 개수가 같을 경우 사전순으로 가장 작은 수열을 출력한다.

입력

첫째 줄에 NN과 MM이 주어진다.

둘째 줄에 우람이의 비밀번호의 각 수를 2진법으로 나타냈을 때 1의 개수를 나타내는 길이 NN의 수열 a_1,⋯ ,a_Na\_1, \cdots, a\_N이 공백을 사이에 두고 주어진다.

출력

첫번째 줄에 가능한 차이가 1인 이웃한 수의 쌍의 개수의 최대값을 출력한다.

두번째 줄에 문제의 조건을 만족하면서 차이가 1인 이웃한 수의 쌍의 개수가 가장 많은 수열을 출력한다. 개수가 같은 수열이 여럿 있는 경우, 사전순으로 가장 작은 수열을 출력한다.

가능한 수열이 없을 경우 -1을 출력한다.

제한

  • 2≤N≤20002 \leq N \leq 2000
  • 3≤M≤10233 \leq M \leq 1023
  • 1≤a_i≤101 \leq a\_i \leq 10

힌트

수열 a_1,...,a_na\_1, ..., a\_n과 수열 b_1,...b_nb\_1, ... b\_n에 대해 앞의 수열이 더 사전순으로 작다는 것은 다음과 같다.

어떤 ii가 존재해서 모든 j\<ij\<i에 대해 a_j=b_ja\_j = b\_j이고 a_i<b_ia\_i < b\_i이다.

예제3

  1. 예제 1

    입력
    5 7
    1 3 2 2 3
    
    예상 출력
    2
    1 7 5 6 7
    
  2. 예제 2

    입력
    7 7
    1 1 2 1 2 2 3
    
    예상 출력
    6
    1 2 3 4 5 6 7
    
  3. 예제 3

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