만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

가까운 문자열

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

요약
숫자 문자열 s와 정수 k가 주어질 때, 길이가 같은 모든 숫자 문자열을 s와의 자릿수 거리가 작은 순서, 같으면 사전순으로 나열한 목록에서 k번째 문자열을 구합니다.
난이도

어려움10점 중 8점

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

문제

오늘 문자열론 수업에서 모리스 교수는 두 문자열 사이의 거리를 구하는 여러 방법을 학생들에게 설명했다. 그중 한 방법은 다음과 같다. 길이가 nn이고 십진수 숫자로만 이루어진 두 문자열 ss와 tt가 있다. 모리스 교수는 같은 위치에 있는 숫자 차이의 절댓값을 모두 더한 값을 두 문자열의 숫자 거리라고 부른다. 즉 ∑i=1n∣si−ti∣\sum_{i=1}^{n} |s_i - t_i|이며, 여기서 sis_i는 ss의 ii번째 위치에 적힌 숫자이고 tit_i는 tt의 ii번째 위치에 적힌 숫자이다.

숙제로 교수는 학생마다 길이 nn의 문자열을 하나씩 주고, 길이 nn인 모든 문자열(10n10^n개)을 주어진 문자열과의 숫자 거리가 작은 순서대로 적으라고 했다. 거리가 같은 두 문자열은 사전순으로 비교한다.

교수는 시간이 부족해서 각 학생의 작업을 일일이 확인하지 못한다. 그래서 학생마다 정수 kk를 알려 주고, 목록의 kk번째에 놓인 문자열만 말해 달라고 한다. 학생들은 이 길고 지루한 작업을 손으로 하기 싫어해서, 주어진 문자열과 kk를 입력받아 답을 출력하는 프로그램을 작성해 달라고 부탁했다.

입력

첫째 줄에 두 정수 nn과 kk (1≤n≤200 0001 \leq n \leq 200\,000, 1≤k≤min⁡(10n,1018)1 \leq k \leq \min(10^{n}, 10^{18}))가 주어진다. 각각 교수가 준 문자열의 길이와, 교수가 관심 있는 최종 목록에서의 위치이다.

둘째 줄에는 십진수 숫자 nn개로 이루어진 문자열이 주어진다.

출력

목록의 kk번째에 적힌, 길이 nn의 십진수 숫자 문자열을 출력한다.

힌트

두 번째 예제에서 목록의 처음 일곱 단어는 00000, 00001, 00010, 00100, 01000, 10000, 00002이다.

단어 x1,x2,…,xax_1, x_2, \ldots, x_a가 단어 y1,y2,…,yby_1, y_2, \ldots, y_b보다 사전순으로 크지 않다는 것은 다음 두 조건 중 하나가 성립한다는 뜻이다.

  • a≤ba \leq b이고 x1=y1,…,xa=yax_1 = y_1, \ldots, x_a = y_a이다. 즉 첫 단어가 둘째 단어의 접두사이다.
  • 어떤 위치 1≤j≤min⁡(a,b)1 \leq j \leq \min(a, b)에 대해 x1=y1,…,xj−1=yj−1x_1 = y_1, \ldots, x_{j-1} = y_{j-1}이고 xj<yjx_j < y_j이다. 즉 처음으로 다른 위치에서 첫 단어의 글자가 더 작다.

예제3

  1. 예제 1

    입력
    5 1
    00000
    
    예상 출력
    00000
    
  2. 예제 2

    입력
    5 7
    00000
    
    예상 출력
    00002
    
  3. 예제 3

    입력
    3 44
    132
    
    예상 출력
    212