페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#2501

[고등부] 2025 KOI 1차대회 대비 모의고사 (4주차)

출력 디버깅
서브태스크
1초 512MB

문제

당신의 멋진 디버거는 이번 문제에 도움이 되지 않습니다.

디버그 빌드와 릴리스 빌드 간에 코드의 동작이 달라지는 경우는 흔하며, 이럴 때는 더 원시적인 디버깅 방식에 의존할 수밖에 없습니다.

이제 당신은 printf문 하나만을 믿고, 릴리스 빌드에서 프로그램이 크래시 나는 라인을 찾아야 합니다.

다행히도 이 프로그램에 printf를 추가해도 버그에는 영향이 없으며, 실행 시간도 거의 변하지 않습니다. 따라서 각 줄 앞에 printf를 추가하고, 프로그램이 언제 멈추는지 확인하는 단순한 방식도 가능합니다.

하지만 한 줄씩 printf를 추가하는 건 시간이 많이 걸리고, 코드 라인 수가 많을 수도 있습니다.

그래서 더 나은 방법은 프로그램 중간에 printf를 넣고 실행시켜, 크래시가 해당 줄 이전인지 이후인지를 판단해 절반씩 범위를 좁혀가는 전략일 수 있습니다.

그러나 프로그램 실행에도 시간이 걸리기 때문에, 가장 시간 효율적인 전략은 위 두 방법의 중간 어딘가일 수 있습니다.
당신의 목표는 어떤 줄에서든 크래시가 발생할 수 있다는 전제하에, 최적의 printf 배치 전략을 사용했을 때 최악의 경우 걸리는 최소 시간을 계산하는 프로그램을 작성하는 것입니다.

이 문제는 매우 긴급합니다. 5시간 안에 새 버전을 릴리스해야 하므로, 즉시 해결이 필요합니다.


입력

한 줄에 정수 세 개가 주어집니다:

  • n (1 ≤ n ≤ 1,000,000): 코드의 줄 수

  • r (1 ≤ r ≤ 1,000,000,000): 프로그램을 컴파일하고 실행해 크래시까지 걸리는 시간

  • p (1 ≤ p ≤ 1,000,000,000): printf 한 줄을 추가하는 데 걸리는 시간

프로그램은 이미 한 번 실행되었으며, 크래시가 발생하는 것은 확실합니다.


출력

최적의 전략을 사용했을 때, 크래시 발생 라인을 찾는 데 걸리는 최악의 경우 최소 시간을 출력하세요.


부분문제

번호 점수 조건
#15점

n\le 2

#210점

r=1, p=10^9

#310점

r=10^9, p=1

#420점

r=p

#525점

n\le1000

#630점

추가 제약 조건 없음


예제 #1

1 100 20
0

예제 #2

10 10 1
19

각 줄 사이에 printf를 추가하여 한 번 실행을 시키면 크래시 발생 라인을 바로 알아낼 수 있다.

  • printf를 추가 9번 (+9)

  • 실행 1번 (+10)


예제 #3

16 1 10
44

전체 코드에서 중간에 printf를 하나 추가한다. (+10)

그리고 실행시켜보면 전체에서 앞부분 혹은 뒷부분 중 어느 위치에서 크래시가 발생하는지 알 수 있다. (+1)

크래시 발생 구간에서 중간에 printf를 하나 추가한다. (+10)

실행시키면 해당 부분에서 다시 절반에 해당하는 구간으로 범위를 좁힐 수 있다. (+1)

이와 같은 방식으로 네 번의 printf 디버깅을 해보면 크래시 발생 위치를 찾을 수 있다.

로그인해야 코드를 작성할 수 있어요.