Множники#8362

Множники (Розбір)

Для того, щоб число, яке не перевищує , мало максимальну кількість дільників, його слід уявити у вигляді добутку як можна менших простих чисел.

Наприклад, спробуємо шукати його у вигляді 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.

Таким чином:

Окремо розглянемо випадок n = 1. Для цього значення відповіддю буде .

Приклад

Нехай n = 100. Найбільшою степеню двійки, не більшою , буде 2^6 = 64. Число має d(64) = 6 + 1 = 7 дільників.

Тепер розглянемо число 2^5 \cdot 3 = 96. Кількість його дільників дорівнює:

d(96) = (5 + 1) * (1 + 1) = 6 * 2 = 12

Оскільки число не перевищує , воно буде шуканим для 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)