사오정

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

요약
N비트 이진수에서 각 비트를 최대 D칸까지 이동시켜 만들 수 있는 서로 다른 이진수의 개수를 구하고, 그중 K번째로 작은 수를 출력합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 누적 합, 그리디
정답자
아직 제출이 없습니다

문제

민식이는 남의 말을 제대로 알아듣지 못한다. 어떤 사람이 N자리 이진수를 말하면, 민식이는 그 소리를 조금 다르게 알아듣는다. 말한 이진수의 i번째 비트는 민식이가 알아듣는 이진수의 j번째 비트 자리로 가는데, 이때 항상 |j - i| ≤ D가 성립한다. 각 자리에는 원래 비트가 정확히 하나씩만 들어가므로, 민식이가 알아듣는 이진수는 말한 이진수의 각 비트를 원래 위치에서 최대 D칸까지 옮겨 만든 재배치(순열)이다.

예를 들어 말한 이진수가 0110이고 D = 1이면, 민식이가 알아들을 수 있는 이진수는 0101, 0110, 1001, 1010으로 모두 4가지이다.

말한 이진수와 정수 D, K가 주어질 때, 민식이가 알아들을 수 있는 서로 다른 이진수의 개수와, 그 후보들 중에서 K번째로 작은 이진수를 구하여라.

입력

첫째 줄에 이진수의 자리 수 N (1 ≤ N ≤ 2,000), 정수 D (0 ≤ D < N), 정수 K (1 ≤ K ≤ 100,000,000)가 공백으로 구분되어 주어진다.

둘째 줄에 어떤 사람이 말한 N자리 이진수가 주어진다.

출력

첫째 줄에 민식이가 알아들을 수 있는 서로 다른 이진수의 개수를 100,000,000으로 나눈 나머지를 출력한다.

둘째 줄에 그 후보들 중 K번째로 작은 이진수를 N자리 이진수로(맨 앞의 0도 그대로 포함하여) 출력한다.

예제4

  1. 예제 1

    입력
    4 1 3
    0110
    
    예상 출력
    4
    1001
    
  2. 예제 2

    입력
    4 1 1
    0110
    
    예상 출력
    4
    0101
    
  3. 예제 3

    입력
    4 1 4
    0110
    
    예상 출력
    4
    1010
    
  4. 예제 4

    입력
    1 0 1
    1
    
    예상 출력
    1
    1