Кількість дільників#4742

Кількість дільників (Розбір)

Позначимо через кількість дільників числа . Очевидно, що d(1) = 1.

Нехай — просте число. Тоді має два дільники: і . Отже, d(p) = 2.

Нехай n = p^k — степінь простого числа. Тоді має k + 1 дільників: 1, p, p_2, p_3, ..., p^k. Отже, d(p^k) = k + 1.

Нехай n = p^k q^l. Розглянемо дві множини: P = {1, p, p_2, p_3, ..., p_k} і Q = {1, q, q_2, q_3, ..., q_l}

Будь-який дільник числа p^k q^l можна представити у вигляді x \cdot y, де x \in P, y \in Q. Дільник з можна вибрати k + 1 способом, дільник з можна вибрати l + 1 способом. Відповідно, дільник d = x \cdot y можна скласти (k + 1) \cdot (l + 1) способами.

Розкладемо число на прості множники: n = p_1^{a_1}p_2^{a_2}...p_k^{a_k}. Кількість дільників числа дорівнює

\nd(n) = (a_1 + 1) \cdot (a_2 + 1) \cdot ... \cdot (a_k + 1)

Приклад

Число n = 18 має дільників: 1, 2, 3, 6, 9, 18.

Розкладемо число n = 18 на прості множники:

18 = 2 \cdot 3^2

Отже

\nd(18) = (1 + 1) \cdot (2 + 1) = 2 \cdot 3 = 6

Віднімаємо два дільники ( і ), отримуємо відповідь: дільники.

Реалізація алгоритму

Функція CountDivisors розкладає число на прості множники і обчислює кількість його дільників .

int CountDivisors(int n)
{
  int c, i, res = 1;
  for(i = 2; i * i <= n; i++)
  {
    if (n % i == 0)
    {
      c = 0;
      while(n % i == 0)
      {
        n /= i;
        c++;
      }
      res *= (c + 1);
    }
  }
  if (n > 1) res *= 2;
  return res;
}

Основна частина програми. Читаємо вхідне значення .

scanf("%d",&n);

Обчислюємо і виводимо відповідь. Із загальної кількості дільників віднімаємо два дільники: і саме число .

printf("%d\n",CountDivisors(n)-2);

Python реалізація

import math

Функція CountDivisors розкладає число на прості множники і обчислює кількість його дільників .

def CountDivisors(n):
  res = 1;
  for i in range(2, int(math.sqrt(n)) + 1):
    if (n % i == 0):
      c = 0
      while (n % i == 0):
        n //= i
        c += 1
      res *= (c + 1);
  if (n > 1): res *= 2;
  return res;

Основна частина програми. Читаємо вхідне значення .

n = int(input())

Обчислюємо і виводимо відповідь. Із загальної кількості дільників віднімаємо два дільники: і саме число .

print(CountDivisors(n) - 2)