만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

시간을 달려서 (Rough)

시간 제한1초메모리 제한1024 MB

요약
G와 F가 주어질 때, 0에서 시작해 +1 또는 두 배로 이동하여 G에 도달하는 최소 이동 횟수를 구합니다. F 이상이 된 시각은 F로 나눈 나머지로 바뀝니다.
난이도

보통10점 중 7점

유형
BFS, 수학, 구현
정답자
아직 제출이 없습니다

문제

미처 말하지 못했어

다만 너를 좋아했어

어린 날의 꿈처럼 마치 기적처럼

시간을 달려서 어른이 될 수만 있다면

거친 세상 속에서 손을 잡아줄게

나는 시간을 달려서 너를 만나고자 한다.

나와 네가 있는 세계에서 시간은 음이 아닌 정수로 나타낼 수 있다.

처음에 나는 시간 00에 있고, 너는 시간 GG에 있다.

시간 xx에 있는 나는 시간을 달려 두 가지 방법으로 이동할 수 있다.

  • x+1x+1로 이동한다
  • 2×x2 \times x로 이동한다

내 시간은 특이한 구조로 되어 있어서, 이동한 뒤 내 시간이 FF 이상이면 x mod Fx \bmod F 시간으로 이동한다. 여기서 x mod Fx \bmod F는 xx를 FF로 나눈 나머지다.

시간 속에서 길을 헤매지 않도록, 너의 시간에 도착하기 위해 시간을 달려 이동하는 횟수의 최솟값을 구하여라.

입력

첫째 줄에 양의 정수 G,FG,F가 주어진다.

출력

첫째 줄에 시간을 달려 이동하는 횟수의 최솟값을 출력하라.

제한

  • 0<G<F≤10180<G<F \leq 10^{18}
  • G≤107G \leq 10^7

힌트

입력이 C/C++의 int 범위를 넘어갈 수 있으므로 long long 자료형을 사용하는 것을 추천한다.

예제2

  1. 예제 1

    입력
    5 6
    
    예상 출력
    4
    
  2. 예제 2

    입력
    7 9
    
    예상 출력
    5