Un enfoque ingenuo para encontrar la cantidad de divisores de un entero positivo n consiste en recorrer todos los números desde 1 hasta n (inclusive) y contar cuántos de ellos dividen a n.
Sin embargo, este método es muy lento. Podemos calcular el número de divisores de n a través de sus factores primos (encontrar los factores primos toma únicamente tiempo ).
Imagina que un número se representa como el producto de sus factores primos:
Podemos calcular la cantidad de divisores de n tomando todos sus exponentes, sumándoles 1 y multiplicando esos resultados entre sí:
Podemos implementarlo de manera muy similar a como encontramos todos los factores primos de n:
n = ...
p, divisors = 1, 1 # factor primo y el número de divisores
while p * p <= n: # mientras p <= sqrt(n)
p += 1 # Suma 1 al factor primo en cada iteración
if n % p != 0: # No hagas nada si n no es divisible entre p
continue
exp = 0 # contador para el exponente
while n % p == 0: # divide tantas veces como sea posible
n //= p
exp += 1
divisors *= exp + 1 # actualiza el producto
if n > 1: # si p > sqrt(n) => n es en sí mismo un factor primo
divisors *= 2 # agrega n como divisor con exponente 1
print(divisors)
Desafío: Encontrar el número de divisores de n
Dado un entero n, se te pide determinar cuántos divisores tiene n.
Entrada
La primera línea de la entrada contiene un único entero n (2 ≤ n ≤ ).
Salida
El programa debe imprimir la cantidad de divisores de n.
Ejemplos
Entrada
Salida
8
4
17
2
2048
12
48
10
Bonus: ¿Por qué al tomar todos los exponentes, sumarlos con 1 y multiplicarlos entre sí obtenemos el total de divisores de n?
La idea detrás de la fórmula para encontrar el número de divisores de n surge de considerar la cantidad de combinaciones posibles de sus factores primos. El exponente de cada factor indica cuántas veces puede usarse en la combinación que forma un divisor de n. Al sumar 1 a cada exponente, se incluyen las combinaciones que utilizan 0 de ese factor (esto permite contar tanto al propio n como al 1 como divisores de n). El resultado final de multiplicar cada (exponente + 1) abarca todas las combinaciones posibles de los factores primos y, por lo tanto, ofrece el total de divisores de n.