Разбор
Пусть — искомая длина стороны квадратной доски. Будем искать бинарным поиском. Очевидно, что . Поиск начнем на отрезке .
Пусть — текущая длина стороны доски. Поскольку диплом имеет размер , то на ней можно разместить максимум дипломов. Если это число меньше , то размер доски маловат, устанавливаем . Иначе двигаем правую границу поиска: .
Пусть размер диплома .
На доске можно расположить максимум дипломов;
На доске можно расположить максимум дипломов;
Минимальный размер стороны доски, на которой можно расположить дипломов, равен .
Реализация алгоритма
Читаем входные данные.
scanf("%lld %lld %lld", &w, &h, &n);
Устанавливаем границы бинарного поиска .
a = 0; b = max(w, h) * n;
Запускаем бинарный поиск.
while (a < b) { m = (a + b) / 2;
Наибольшее количество дипломов размера , которое можно расположить на доске со стороной , равно .
dip = (m / w) * (m / h); if (dip < n) a = m + 1; else b = m; }
Выводим ответ.
printf("%lld\n", b);
Python реализация
Читаем входные данные.
w, h, n = map(int, input().split())
Устанавливаем границы бинарного поиска .
a = 0 b = max(w, h) * n
Запускаем бинарный поиск.
while a < b: m = (a + b) // 2
Наибольшее количество дипломов размера , которое можно расположить на доске со стороной , равно .
dip = (m // w) * (m // h) if dip < n: a = m + 1 else: b = m
Выводим ответ.
print(b)