1808c
Jul 09, 231808C
summary:
$l$ 이상 $r$이하의 수 중, 수에 포함된 가장 작은 숫자와 가장 큰 숫자의 차이가 최소 인 수를 찾아서 출력하는 문제이다.
solution:
$f(n,m,M)$: $n$이하 가장 작은 숫자가 $m$이상, 가장 큰 숫자가 $M$이하인 수의 개수
$n$의 각 자리 숫자를 확인한다. $n$의 자릿수(n에 포함된 숫자 개수)를 $len$이라고 하고, 현재 위치의 자릿수를 $d_i$라고 하자.
$i$번째 인덱스에서 두 가지 경우의 수를 고려할수 있다. ($d_i<a, d_i>b$인 경우에는 더 이상 진행할수 없다)
$d_i$를 고정시킨다. -> 뒤(더 적은 자릿수)의 수로 넘어가서 반복한다.
$d_i$를 감소시킨다. $d_i$가 $m$이상 $min(m,d_i-1)$이하가 될수 있으므로, 가능한 $d_i$의 개수(=$min(M,d_i)-m+1$)와 $(M-m+1)^{len-i-1}$을 곱해서 경우의 수에 더해준다. ($M-m+1$: 가능한 숫자 개수, $len-i-1$: $i$이후 남은 자릿수)
그리고 $m$이 0이 아니고(만약 $m$이 0인 경우에는 위의 연산으로 해결된다) $len$이 1보다 크면 맨 앞자리 수가 0인 경우도 고려해줘야 한다. 따라서 $(M-m+1)+(M-m+1)^{2}+ \dots + (M-m+1)^{len-1}$를 더해준다.
ex) $n=78765, m=3, M=9$인 경우 (0)3232, (00)443, (0000)2 등의 경우를 고려해줘야 함.
$g(n,m,M)$: $n$이하 가장 작은 숫자가 $m$, 가장 큰 숫자가 $M$인 수의 개수
$=f(n,m,M)-f(n,m+1,M)-f(n,m,M-1)+f(n,m+1,M-1)$
로 정의한다.
그런 다음 가능한 숫자 $m,M$ ($g(r,m,M)-g(l-1,m,M)>0$, $M-m$ 최대)의 차이를 브루트포스로 구하고,
이분탐색으로 $g(n,m,M)-g(l-1,m,M)>0$를 만족하는 가장 작은 n를 구하면 된다. (문제에서는 아무거나 출력해도 되지만 처음부터 보기엔 너무 수가 많기 때문)
opinion:
이 문제는 백준에서 자릿수 관련된 다른 문제에서 많이 본 것 같고 나중에도 써먹을수 있을 것 같다. 잘 기억해 두자.