Для того, щоб число, яке не перевищує , мало максимальну кількість дільників, його слід уявити у вигляді добутку як можна менших простих чисел.
Наприклад, спробуємо шукати його у вигляді 2^k. Знайдемо найбільше , для якого 2^k \le n. Кількість дільників числа 2^k дорівнює d(2^k) = k + 1.
Потім розглянемо число 2^{k - 1} \cdot 3. Кількість його дільників дорівнює d(2^{k - 1} \cdot 3) = k \cdot 2, що більше, ніж k + 1.
Таким чином:
Якщо 2^{k - 1} \cdot 3 \le n, то шуканим числом буде 2^{k - 1} \cdot 3;
В протилежному випадку відповіддю буде 2^k.
Окремо розглянемо випадок n = 1. Для цього значення відповіддю буде .
Приклад
Нехай n = 100. Найбільшою степеню двійки, не більшою , буде 2^6 = 64. Число має d(64) = 6 + 1 = 7 дільників.
Тепер розглянемо число 2^5 \cdot 3 = 96. Кількість його дільників дорівнює:
Оскільки число не перевищує , воно буде шуканим для n = 100.
Реалізація алгоритму
Читаємо вхідне число .
scanf("%d",&n);Шукаємо найбільше p = 2^k, таке що p \le n.
p = 1;
while (p * 2 <= n)
p = p * 2;Далі обчислимо p1 = 2^{k - 1} \cdot 3 = p / 2 \cdot 3.
p1 = p / 2 * 3;Знаходимо відповідь . Якщо n = 1, то відповіддю буде .
if (p1 <= n) res = p1; else res = p;
if (n == 1) res = 1;Виводимо відповідь.
printf("%d\n",res);Python реалізація
Читаємо вхідне число .
n = int(input())Шукаємо найбільше p = 2^k, таке що p \le n.
p = 1
while p * 2 <= n:
p *= 2Далі обчислимо p1 = 2^{k - 1} \cdot 3 = p / 2 \cdot 3.
p1 = (p // 2) * 3Знаходимо відповідь . Якщо n = 1, то відповіддю буде .
if p1 <= n: res = p1
else: res = p
if n == 1: res = 1Виводимо відповідь.
print(res)