Ограничение по времени: 1
секунда
Ограничение по памяти: 256
мегабайт
Администрация города решила разбить парк на пустыре площадью N×M
. В парке планируется высадить деревья. Для каждого дерева нужно выделить участок прямоугольной формы с целочисленными сторонами и площадью, равной S
.
Все участки должны быть равны, одинаково ориентированы, и их стороны должны быть параллельны сторонам пустыря.
Какое наибольшее количество деревьев можно высадить в парке?
Формат входных данных
В трёх строках вводится три числа N
, M
, S
(1≤N⋅M≤1018,
1≤S≤1012
python
import math
# функция для нахождения всех делителей числа
def divisors(n):
divs = []
for i in range(1, int(math.sqrt(n)) + 1):
if n % i == 0:
divs.append(i)
if i != n // i:
divs.append(n // i)
return sorted(divs, reverse=True)
# ввод данных
N = int(input())
M = int(input())
S = int(input())
# нахождение делителей площади S
s_divisors = divisors(S)
# поиск максимального количества деревьев
max_trees = 0
for d in s_divisors:
f = min(N // d, M // (S // d))
max_trees = max(max_trees, f * f)
# вывод результата
print(max_trees)
Сложность данного алгоритма зависит от количества делителей площади S и составляет O(sqrt(S)). В худшем случае, при S = 10^12, алгоритм будет выполнен за приемлемое время.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет