Dado 3 números x, n y m, se te pide calcular el resultado de .
Entrada
La única línea de la entrada contiene 3 enteros x, n y m (1 ≤ x, n, m ≤ ).
Salida
El programa debe imprimir el resultado de la expresión .
Ejemplos
Entrada
Salida
2 10 5
4
Explicación
2^10 = 1024 ⇒ 1024 mod 5 = 4
Tutorial
Dado que todos los números son bastante grandes, es necesario emplear un algoritmo rápido para asegurar que sea lo suficientemente eficiente. 1. La exponentiación binaria es una forma eficaz de calcular potencias de valores grandes. Reduce el número de multiplicaciones necesarias para obtener la potencia, lo que la hace más rápida que el método tradicional de iterar desde 1 hasta n y multiplicar cada vez por x.
El algoritmo de exponentiación binaria se basa en la siguiente idea matemática: si tenemos un número x elevado a la potencia n, entonces puede expresarse como:
si n es par
si n es impar
Esto agiliza el proceso, ya que podemos calcular una sola vez y luego multiplicar el resultado por sí mismo. El algoritmo puede verse así:
def binpow(x, n, m):
if n == 0: # Caso base: x^0 = 1
return 1
if n % 2 == 0: # n es par => calcular la mitad y multiplicar
half = binpow(x, n // 2, m) # calcular la mitad
return (half * half) % m # res = x^(n/2) * x^(n/2)
# n es impar => res = x * x^(n-1)
return (x * binpow(x, n - 1, m)) % m
Con la exponentiación binaria, reducimos la complejidad de tiempo desde hasta , porque se divide n en cada iteración cuando es par. Es importante notar que, en cada operación en la que n es impar, para la siguiente iteración n pasa a ser par.
Veamos cómo se simula el algoritmo en varios valores de entrada: