반복되는 수열

면접 대비

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

요약
각 (a0, L)에 대해 자릿수를 재배열해 큰 수에서 작은 수를 빼는 과정을 반복하다 값이 처음 겹치는 지점을 찾아 j, 반복되는 값, 주기를 출력한다.
난이도

보통10점 중 4점

유형
해시맵, 시뮬레이션, 구현, 수학
정답자
아직 제출이 없습니다

문제

정수의 십진법 표현은 각 자리 숫자의 순서를 바꾸어 다른 정수로 만들 수 있다. 이 성질을 이용해 수열을 만든다.

음이 아닌 정수 a0a_0과 자릿수 LL이 주어진다. 다음 규칙에 따라 aia_i로부터 ai+1a_{i+1}을 얻는다.

  1. aia_i를 정확히 LL자리 십진수로 적는다. 필요하면 앞에 00을 채운다. 예를 들어 여섯 자리로 적으면 20122012는 002012002012가 된다.
  2. 각 자리 숫자를 재배열하여 만들 수 있는 가장 큰 정수와 가장 작은 정수를 구한다. 위 예에서 가장 큰 값은 221000221000, 가장 작은 값은 000122=122000122 = 122이다.
  3. 가장 큰 값에서 가장 작은 값을 빼서 ai+1a_{i+1}을 얻는다. 위 예에서는 221000−122=220878221000 - 122 = 220878이다.

이 계산을 반복하면 수열 a0,a1,a2,…a_0, a_1, a_2, \dots가 만들어진다.

예를 들어 a0=83268a_0 = 83268, L=6L = 6에서 시작하면 다음과 같다.

  • a0=083268a_0 = 083268
  • a1=886320−023688=862632a_1 = 886320 - 023688 = 862632
  • a2=866322−223668=642654a_2 = 866322 - 223668 = 642654
  • a3=665442−244566=420876a_3 = 665442 - 244566 = 420876
  • a4=876420−024678=851742a_4 = 876420 - 024678 = 851742
  • a5=875421−124578=750843a_5 = 875421 - 124578 = 750843
  • a6=875430−034578=840852a_6 = 875430 - 034578 = 840852
  • a7=885420−024588=860832a_7 = 885420 - 024588 = 860832
  • a8=886320−023688=862632a_8 = 886320 - 023688 = 862632
  • …\dots

자릿수가 고정되어 있으므로 어떤 값은 반드시 다시 나타나며, 따라서 항상 ai=aja_i = a_j (i>ji > j)를 만족하는 쌍이 존재한다. 위 예에서는 a8=a1=862632a_8 = a_1 = 862632이므로 (i=8,j=1)(i = 8, j = 1)이 조건을 만족한다.

a0a_0과 LL이 주어질 때, 어떤 j<ij < i에 대해 ai=aja_i = a_j가 성립하는 가장 작은 ii를 찾는 프로그램을 작성하라.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 각 데이터셋은 공백으로 구분된 두 정수 a0a_0과 LL이 적힌 한 줄이며, 1≤L≤61 \le L \le 6이고 0≤a0<10L0 \le a_0 < 10^L이다.

두 개의 00이 적힌 줄은 입력의 끝을 나타내며, 데이터셋이 아니다.

출력

각 데이터셋에 대해 ai=aja_i = a_j (i>ji > j)를 만족하는 가장 작은 ii를 찾아, 세 정수 jj, aia_i, i−ji - j를 공백 하나로 구분하여 한 줄에 출력한다. 앞자리 00은 표시하지 않으며, 그 밖의 어떤 문자도 출력하지 않는다.

이 ii는 항상 2020을 넘지 않는다고 가정해도 된다.

예제1

  1. 예제 1

    입력
    2012 4
    83268 6
    1112 4
    0 1
    99 2
    0 0
    
    예상 출력
    3 6174 1
    1 862632 7
    5 6174 1
    0 0 1
    1 0 1