Q - 금고 부수기(Vault Breaker)

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

요약
N자리 B진수 표시를 두 버튼으로만 조작해, 두 버튼을 각각 한 번 이상 누르면서 원래 수로 돌아오는 최단 순서를 구한다.
난이도

보통10점 중 7점

유형
수학, 정수론, 구현, 완전 탐색
정답자
아직 제출이 없습니다

문제

유틸은 MatKor 임원인 세준이의 초대를 받아 MatKor 임원진의 방에 들어갈 수 있게 되었다. 세준이의 Codeforces핸들이 SafeSpot인 만큼 임원진의 방에는 금고가 있다.

이 금고의 비밀번호는 NN자리의 BB진수로 표시되며, 00으로 시작할 수 있다. 현재 금고의 모니터에는 NN자리의 BB진수 S=S_N−1S_N−2⋯S_1S_0‾_(B)S=\overline{S\_{N-1}S\_{N-2}\cdots S\_1S\_0}\_{\left( B \right)}가 표시되어 있다. 모니터에 표시된 수는 두 종류의 버튼을 눌러서 조작할 수 있다. 버튼은 한 번에 하나씩만 누를 수 있고, 각 버튼을 눌렀을 때 다음과 같이 동작한다.

  • 버튼 A. 현재 표시된 수에 11을 더한다. 만약 결과가 NN자리 수를 넘어간다면 마지막 NN자리만 표시된다. 즉, S←(S+1) mod BNS\leftarrow\left( S+1 \right)\bmod{B^N}으로 바꾼다.
  • 버튼 B. 현재 표시된 수의 각 자리 수에 각각 11을 더한다. 만약 결과가 BB가 되면 00이 된다. 즉, 모든 ii에 대해 S_i←(S_i+1) mod BS\_i\leftarrow\left( S\_i+1 \right)\bmod B로 바꾼다.

세준이가 잠시 자리를 비운 사이 호기심이 많은 유틸은 버튼을 눌러서 금고를 조작해 보기로 했다. 한 가지 버튼만 계속 누르는 것은 재미없기 때문에 버튼 A와 B를 모두 최소한 한 번은 눌러 볼 것이다. 하지만 초기 상태에서 값이 바뀌어 있다면 세준이에게 자신이 금고를 조작한 것을 들킬 수 있기 때문에, 조작이 끝났을 때 모니터에 표시된 수가 다시 SS가 되게 하려고 한다. 또한, 세준이가 언제 돌아올지 모르는 유틸은 버튼을 누르는 횟수를 최소화하고자 한다.

유틸을 도와 금고의 버튼을 최소한으로 눌러 수가 다시 SS가 되도록 해보자. 단, 두 버튼 모두 최소 한 번 이상은 눌러야 한다.

NN자리의 BB진수 S=S_N−1S_N−2⋯S_1S_0‾_(B)S=\overline{S\_{N-1}S\_{N-2}\cdots S\_1S\_0}\_{\left( B \right)}는 아래의 수를 의미한다.

\[S=\overline{S_{N-1}S_{N-2}\cdots S_1S_0}_{\left( B \right)}=\sum_{i=0}^{N-1}{S_iB^i}\]

입력

첫 번째 줄에 비밀번호의 자릿수를 나타내는 정수 N(1≤N≤100,000)N(1\le N\le 100\\, 000)과 진법을 나타내는 정수 B(2≤B≤100,000)B(2\le B\le 100\\, 000)가 공백으로 구분되어 주어진다.

두 번째 줄에 SS의 각 자리를 나타내는 NN개의 정수 S_N−1,S_N−2,⋯ ,S_1,S_0(0≤S_i\<B)S\_{N-1},S\_{N-2},\cdots ,S\_1,S\_0(0\le S\_i\<B)가 공백으로 구분되어 주어진다.

출력

첫 번째 줄에 버튼을 누르는 횟수의 최솟값 VV를 출력한다. 만약 VV가 4,000,0004\\, 000\\, 000을 초과하는 경우 -1을 대신 출력한다.

만약 VV가 4,000,0004\\, 000\\, 000 이하인 경우, 두 번째 줄에 길이 VV의 문자열을 출력한다. 문자열의 각 문자는 A 또는 B이며 버튼을 누르는 순서를 의미한다.

횟수를 최소로 만드는 시행이 여러 개인 경우 아무거나 하나를 출력한다.

힌트

세준이의 Codeforces핸들은 SafeSpot이고, BOJ핸들은 devluyten이다.

예제1

  1. 예제 1

    입력
    3 3
    2 0 1
    
    예상 출력
    6
    BBAAAA