달팽이는 올라가고 싶다

import sys


def main():
    input = sys.stdin.readline

    up, down, height = map(int, input().split())
    days = 1 + -((height - up) // -(up - down))

    print(days)


main()

이 문제는 달팽이의 높이를 매일 시뮬레이션하여 풀 수는 없습니다. 최악의 경우 $V = 1\,000\,000\,000$, $A=2$, $B=1$이면 걸리는 날이 너무 길어집니다.

문제의 일반해를 찾아봅시다. 달팽이가 나무 막대를 모두 올라갔을 때는 항상 낮입니다. 따라서 첫날 낮에 $A$미터를 올라가 $V - A$미터가 남은 상태에서, 밤과 다음 날 낮에 $A - B$미터씩 올라가는 과정을 반복한다고 생각할 수 있습니다. 즉, 달팽이가 모두 올라간 날이 $D$일 후라면 다음이 성립합니다: $$ D = 1 + \left\lceil \frac{V - A}{A - B} \right\rceil. $$ 문제에 주어진 조건에 의해 $\frac{V - A}{A - B} \ge 0$입니다. 위 식은 첫날 낮에 나무 막대를 모두 올라간 경우($V = A$)에도 성립함을 확인할 수 있습니다.

문제에서 정상에 올라간 후에는 미끄러지지 않는다고 했으므로, 다음 식은 잘못되었습니다: $$ D \overset{?}{=} \left\lfloor \frac{V}{A - B} \right\rfloor. $$

몫과 나머지 2

Python 코드
$\left\lfloor x / y \right\rfloor$ x // y
$\left\lceil x / y \right\rceil$ -(x // -y)
댓글