Q - 금고 부수기(Vault Breaker)
시간 제한1초메모리 제한1024 MB
N자리 B진수 표시를 두 버튼으로만 조작해, 두 버튼을 각각 한 번 이상 누르면서 원래 수로 돌아오는 최단 순서를 구한다.
문제
유틸은 MatKor 임원인 세준이의 초대를 받아 MatKor 임원진의 방에 들어갈 수 있게 되었다. 세준이의 Codeforces핸들이 SafeSpot인 만큼 임원진의 방에는 금고가 있다.
이 금고의 비밀번호는 자리의 진수로 표시되며, 으로 시작할 수 있다. 현재 금고의 모니터에는 자리의 진수 가 표시되어 있다. 모니터에 표시된 수는 두 종류의 버튼을 눌러서 조작할 수 있다. 버튼은 한 번에 하나씩만 누를 수 있고, 각 버튼을 눌렀을 때 다음과 같이 동작한다.
- 버튼
A. 현재 표시된 수에 을 더한다. 만약 결과가 자리 수를 넘어간다면 마지막 자리만 표시된다. 즉, 으로 바꾼다. - 버튼
B. 현재 표시된 수의 각 자리 수에 각각 을 더한다. 만약 결과가 가 되면 이 된다. 즉, 모든 에 대해 로 바꾼다.
세준이가 잠시 자리를 비운 사이 호기심이 많은 유틸은 버튼을 눌러서 금고를 조작해 보기로 했다. 한 가지 버튼만 계속 누르는 것은 재미없기 때문에 버튼 A와 B를 모두 최소한 한 번은 눌러 볼 것이다. 하지만 초기 상태에서 값이 바뀌어 있다면 세준이에게 자신이 금고를 조작한 것을 들킬 수 있기 때문에, 조작이 끝났을 때 모니터에 표시된 수가 다시 가 되게 하려고 한다. 또한, 세준이가 언제 돌아올지 모르는 유틸은 버튼을 누르는 횟수를 최소화하고자 한다.
유틸을 도와 금고의 버튼을 최소한으로 눌러 수가 다시 가 되도록 해보자. 단, 두 버튼 모두 최소 한 번 이상은 눌러야 한다.
자리의 진수 는 아래의 수를 의미한다.
\[S=\overline{S_{N-1}S_{N-2}\cdots S_1S_0}_{\left( B \right)}=\sum_{i=0}^{N-1}{S_iB^i}\]
입력
첫 번째 줄에 비밀번호의 자릿수를 나타내는 정수 과 진법을 나타내는 정수 가 공백으로 구분되어 주어진다.
두 번째 줄에 의 각 자리를 나타내는 개의 정수 가 공백으로 구분되어 주어진다.
출력
첫 번째 줄에 버튼을 누르는 횟수의 최솟값 를 출력한다. 만약 가 을 초과하는 경우 -1을 대신 출력한다.
만약 가 이하인 경우, 두 번째 줄에 길이 의 문자열을 출력한다. 문자열의 각 문자는 A 또는 B이며 버튼을 누르는 순서를 의미한다.
횟수를 최소로 만드는 시행이 여러 개인 경우 아무거나 하나를 출력한다.
힌트
세준이의 Codeforces핸들은 SafeSpot이고, BOJ핸들은 devluyten이다.