문제 링크
- https://icpc.me/21824
문제 출처
- 2021 CCO Day1 2번
사용 알고리즘
- DFS/BFS
풀이
진법의 개념에서 크게 벗어나지 않기 위해서 일단 $M \leq K, n \neq 0$인 상황만 생각해 봅시다.
이런 상황에서는 매 단계마다 $n$이 존재할 수 있는 구간을 $[-K^t, K^t]$에서 $[-K^{t-1}, K^{t-1}]$으로 축소시킬 수 있습니다. $n \equiv a_i \pmod K$인 $a_i$를 마지막에 붙인다고 가정한 다음, $(n-a_i)/K$에 대해서 문제를 해결하면 되기 때문입니다. 따라서 $M \leq K$이면 재귀적으로 문제를 해결할 수 있습니다.
$n = 0$일 때 공집합을 출력하면 안 된다는 이상한 조건이 붙어있습니다. 공집합이 아니라는 것은 마지막에 어떤 원소 $a_i$를 붙여야 한다는 것이고, 당연히 $a_i \equiv 0 \pmod K$를 만족해야 합니다.
마지막에 $a_i$를 붙여서 $0$이 되기 위해서는 $(-a_i/K)\times K + a_i$ 꼴이 되어야 합니다. 따라서 위에서 설명한 풀이를 이용해 $-a_i/K$를 만드는 방법을 구하면 됩니다.
마지막으로 $M > K$인 경우를 생각해 봅시다. 이 경우에는 구간을 $K$배만큼 축소가 불가능할 수도 있기 때문에 위에서 설명한 풀이를 적용하지 못합니다.
어떤 상황에서 축소에 실패하는지 살펴봅시다. 대부분의 경우에는 $a_i$를 더하는 것보다 $K$로 나누는 것의 영향력이 더 크기 때문에 축소를 할 수 있습니다. 하지만 $\vert n \vert \leq M$이면 $a_i$를 더하는 것으로 인해서 $[-M, M]$ 범위 밖으로 벗어나는 일이 발생할 수 있습니다. 따라서 절댓값이 $M$ 이하인 수들에 대해서는 다른 방법으로 경로를 탐색해야 합니다.
다행히도 $M$이 $2\,500$ 정도로 굉장히 작기 때문에 단순히 BFS를 이용해 전처리해도 괜찮습니다. $n$을 계속 축소하다가 $\vert n \vert \leq M$이 되면 BFS로 전처리한 경로를 사용하면 됩니다.
재귀적으로 탐색하는 깊이가 $O(\log_K N)$ 정도로 매우 작기 때문에 시간 제한 안에 문제를 해결할 수 있습니다.
전체 코드
1 |
|