Задача J с Huge Easy Contest II на uva.onlinejudge.org (текст задачи в оригинале на английском).
Вольный перевод:
Стив играет с числами. Он выбирает произвольное число N и находит наибольшее положительное число, не превосходящее N, имеющее наибольшее число делителей.
По мере увеличения N, Стиву все сложнее избежать ошибок при подсчете делителей, поэтому он просит вас написать программу. Вы утверждаете, что найти делители числа - легкая задача, поэтому вы легко сможете решить исходную задачу Стива.
Входные данные
В первой строке дается количество тестов T (T ≤ 50000). В следующих T строках записано единственное число N (1 ≤ N ≤ 106), соответствующее данному тесту.
Выходные данные
Каждая из T строк должна содержать единственное число - ответ на задачу Стива.
SAMPLE INPUT
3
1
10
37
SAMPLE OUTPUT
1
10
36
Подскажите, пожалуйста, идею, как решить эту задачу.
Зачем бинпоиск, если у нас есть массив частичных максимумов?
Просто возвращаем N-ый элемент этого массива.
Есть ведь формула для подсчета количества делителей. Вот только для каждого числа использовать эту формулу...
Достаточно сделать наблюдение, что число i является делителем всех чисел {i, 2i, 3i, ... m*i}, m*i<=N.
Следовательно, меняем i от 1 до 10^6, а j от i до 10^6 с шагом i, и внутри этого двойного цикла увеличиваем divisors[j] на 1.
Оценка (MlogM), где M у нас и есть 10^6.
Чтобы отвечать на запросы за O(1), проще всего сначала посчитать (за линейное время) частичные максимумы.
Тимус: 1748. Самое сложное число