// Arup Guha
// 4/19/2020
// Solution to 2020 January Silver USACO Problem: Loan Repayment

import java.util.*;
import java.io.*;

public class loan {
	
	public static void main(String[] args) throws Exception {
		
		Scanner stdin = new Scanner(new File("loan.in"));
		long owe = stdin.nextLong();
		long timeLimit = stdin.nextLong();
		long minPerDay = stdin.nextLong();
		
		long low = 1, high = owe;
		
		// Do a binary search on x.
		while (low < high) {
			long mid = (low+high+1)/2;
			
			// Update low or high accordingly.
			if (canDo(owe, timeLimit, minPerDay, mid))
				low = mid;
			else
				high = mid-1;
		}
		
		// Output result.
		PrintWriter out = new PrintWriter(new FileWriter("loan.out"));
		out.println(low);
		out.close();		
		stdin.close();
	}
	
	// Returns true if we can do this case in tL days or fewer for x.
	public static boolean canDo(long owe, long tL, long min, long x) {
		
		// I can just simulate day by day.
		if (tL < 2000000 || x < 2000000) return sim(owe, tL, min, x);
		
		// Current time.
		long t = 0;

		// Simulate.
		while (t <= tL && owe > 0) {
			
			// Helps us decide how many days in a row we have the same payment.
			long leftover = owe%x;
			long sub = Math.max(min,owe/x);
			
			// Special case - all the rest of the days are the same payment.
			if (sub == min) {
				long daysLeft = tL - t;
				return daysLeft*min >= owe;
			}
			
			// # of times we make this same payment.
			long divOut = (leftover+sub)/sub;
			
			// I can "chunk" these payments and process all at once.
			if (t + divOut <= tL) {
				t += divOut;
				owe -= (divOut*sub);
				if (owe <= 0) return true;
			}
			
			// Last "chunk" - have to calculate chunk size and return.
			else {
				long diff = tL - t;
				t += diff;
				owe -= (diff*sub);
				return owe <= 0;
			}
		}
		
		// Logically, this is what goes here.
		return t <= tL && owe <= 0;
	}
	
	// Regular simulation - day by day.
	public static boolean sim(long owe, long tL, long min, long x) {
		
		long t = 0;
		
		// Just do what the problem says.
		while (t < tL) {
			long sub = Math.max(min, owe/x);
			owe -= sub;
			t++;
			if (owe <= 0) return true;
		}
		return false;
	}
	
}
	