Skip to Content

Potencia de un divisor en el factorial

Se dan dos números nn y kk. Hallar el mayor entero xx tal que kxk^x divide a n!n!.

kk primo {data-toc-label=“k primo”}

Consideremos primero el caso de kk primo. La expresión explícita del factorial

n!=123(n1)nn! = 1 \cdot 2 \cdot 3 \ldots (n-1) \cdot n

Nótese que cada kk-ésimo elemento del producto es divisible por kk, es decir, suma +1+1 a la respuesta; la cantidad de tales elementos es nk\Bigl\lfloor\dfrac{n}{k}\Bigr\rfloor.

Luego, cada k2k^2-ésimo elemento es divisible por k2k^2, es decir, suma otro +1+1 a la respuesta (la primera potencia de kk ya se contó en el párrafo anterior). La cantidad de tales elementos es nk2\Bigl\lfloor\dfrac{n}{k^2}\Bigr\rfloor.

Y así sucesivamente, para cada ii cada kik^i-ésimo elemento suma otro +1+1 a la respuesta, y hay nki\Bigl\lfloor\dfrac{n}{k^i}\Bigr\rfloor de esos elementos.

La respuesta final es

nk+nk2++nki+\Bigl\lfloor\dfrac{n}{k}\Bigr\rfloor + \Bigl\lfloor\dfrac{n}{k^2}\Bigr\rfloor + \ldots + \Bigl\lfloor\dfrac{n}{k^i}\Bigr\rfloor + \ldots

Este resultado también se conoce como fórmula de Legendre . La suma es por supuesto finita, ya que solo aproximadamente los primeros logkn\log_k n elementos no son ceros. Así, el tiempo de ejecución de este algoritmo es O(logkn)O(\log_k n).

Implementación

int fact_pow (int n, int k) { int res = 0; while (n) { n /= k; res += n; } return res; }

kk compuesto {data-toc-label=“k compuesto”}

La misma idea no se puede aplicar de forma directa. En su lugar podemos factorizar kk, representándolo como k=k1p1kmpmk = k_1^{p_1} \cdot \ldots \cdot k_m^{p_m}. Para cada kik_i, hallamos la cantidad de veces que está presente en n!n! usando el algoritmo descrito arriba; llamemos a este valor aia_i. La respuesta para kk compuesto será

mini=1maipi\min_ {i=1 \ldots m} \dfrac{a_i}{p_i}