대출 상환

시간 제한2초메모리 제한512 MB

요약
남은 양을 X로 나눈 몫을 매일 갚되 M보다 작으면 M을 갚을 때, K일 안에 N갤런을 모두 갚는 가장 큰 X를 구한다.
난이도

어려움10점 중 8점

유형
이분 탐색, 수학, 그리디, 시뮬레이션
정답자
아직 제출이 없습니다

문제

Farmer John은 Bessie에게 우유 NN갤런(1≤N≤10121\le N\le 10^{12})을 빚졌다. 그는 KK일 안에 우유를 갚아야 한다. 하지만 우유를 너무 빨리 다 줘 버리고 싶지는 않다. 한편으로는 대출 상환을 진전시켜야 하므로, 매일 최소 MM갤런(1≤M≤10121\le M\le 10^{12})의 우유를 Bessie에게 주어야 한다.

Farmer John이 Bessie에게 빚을 갚는 방식은 다음과 같다. 먼저 양의 정수 XX를 하나 고른다. 그런 다음 매일 다음 절차를 반복한다.

  1. Farmer John이 지금까지 Bessie에게 GG갤런을 주었다고 하자. N−GX\frac{N-G}{X}을 내림한 값을 계산한다. 이 값을 YY라고 부르자.
  2. YY가 MM보다 작으면 YY를 MM으로 정한다.
  3. Bessie에게 YY갤런의 우유를 준다.

Farmer John이 위 절차를 따를 때 KK일 후에 Bessie에게 적어도 NN갤런의 우유를 주게 되는 가장 큰 XX를 구하라(1≤K≤10121\le K\le 10^{12}).

입력

입력은 단 하나의 줄로 이루어지며, 공백으로 구분된 세 개의 양의 정수 NN, KK, MM이 주어진다. 이들은 K⋅M<NK\cdot M<N을 만족한다.

출력

Farmer John이 위 절차로 Bessie에게 적어도 NN갤런의 우유를 주게 되는 가장 큰 양의 정수 XX를 출력한다.

힌트

첫 번째 테스트 케이스에서 X=2X=2이면 Farmer John은 첫째 날에 Bessie에게 55갤런을 주고, 그다음 이틀 동안은 매일 M=3M=3갤런을 준다.

이 문제에 등장하는 정수의 크기가 크므로 64비트 정수 자료형(예: C/C++의 "long long")이 필요할 수 있다.

예제1

  1. 예제 1

    입력
    10 3 3
    
    예상 출력
    2