¿Cómo resolverías (2 ^ 2 ^ a mod b)?

Explicaré mi solución desde el punto de vista algorítmico.

En primer lugar, debe saber acerca de la exponenciación modular (solo vea el pseudocódigo).

Para encontrar [math] b ^ {e} [/ math] de manera eficiente, el algoritmo itera sobre la representación binaria (de derecha a izquierda) del exponente [math] e [/ math]. En cada paso, [math] b [/ math] se está elevando al cuadrado. Y para cada [matemática] 1 [/ matemática] en la representación binaria, [matemática] b [/ matemática] se multiplica por el resultado [matemática] [/ matemática]. Al final, [matemáticas] resultado = b ^ {e} [/ matemáticas]. (Todos los valores se calculan módulo [matemática] m [/ matemática], por supuesto).

Para este problema en particular, [matemáticas] b = 2, e = 2 ^ a. [/ Matemáticas]

En la representación binaria de [math] 2 ^ a [/ math], hay un [math] 1 [/ math] seguido de [math] a [/ math] [math] 0 [/ math] s. ([matemática] 100000 [/ matemática]… [matemática] a [/ matemática] ceros)

¿Qué hará el algoritmo en este caso?

  1. Cuadra la base [matemáticas] b [/ matemáticas], [matemáticas] a [/ matemáticas] veces.
  2. Multiplique [math] b [/ math] con [math] result [/ math] una vez.

Básicamente, para este problema en particular, si cuadras [matemáticas] b [/ matemáticas] (que es [matemáticas] 2 [/ matemáticas], en este caso) [matemáticas] a [/ matemáticas] veces, [matemáticas] b [ / matemáticas] en sí se convierte en la respuesta.

Puedes ver mi código C ++. http://pastebin.com/2Ap4X4R1

Considere la representación de 2 ^ x en binario en lugar de decimal. Siempre será 1 y luego algunos ceros. Específicamente, serán ceros “x”. 2 ^ 0 no tiene ceros finales, 2 ^ 1 tiene 1 cero final, etc. Por lo tanto 2 ^ (2 ^ a) tendrá 2 ^ a ceros finales. Esto será útil para el paso del patrón al que haré referencia más adelante.

A partir de ahí, puede dividir por b y tomar el resto. En el caso especial donde b = 2 ^ k, está tomando los últimos k términos de su número anterior. Para todos los demás números, surgirá un patrón en la división que le permitirá calcularlo más rápido que simplemente realizar el paso de división completo si eso fuera de interés. Esto es más rápido para los números donde b es menor que 2 ^ a porque hay un máximo de b posibilidades para el resto de la división (cuando solo hay 0s en la representación numérica como en binario) en el patrón de longitud máxima que luego se repetirá, entonces que cualquier cálculo pasado que al continuar con el cálculo completo se repita y se pueda omitir.

* recuerda volver a convertir a decimal cuando consideres tu respuesta

Una forma sencilla de ver este problema es dividirlo en un subproblema:
2 ^ (2 ^ a) = 2 ^ (2. (2 ^ (a-1))) = 2 ^ (2 ^ (a-1) + 2 ^ (a-1)) = 2 ^ (2 ^ ( a-1)) * 2 ^ (2 ^ (a-1))
Entonces, la solución de f (a) = (2 ^ 2 ^ a) = f (a-1) * f (a-1)
Por lo tanto, F (a) = f (a) mod b = (f (a-1) * f (a-1)) mod b = (f (a-1) mod b * f (a-1) mod b ) mod b = (F (a-1) * F (a-1)) mod b
Caso base F (1) = 4 mod b

La solución se puede encontrar en: HackerRank 101 Hack Diciembre de 2014 Superpoderes de 2

More Interesting

¿Qué ventaja tiene la lógica difusa en las ollas arroceras sobre la lógica digital / sensor convencional?

¿Qué tan útil será el algoritmo de Shor para las computadoras cuánticas?

¿Puede un desarrollador web beneficiarse de la CS teórica? ¿Cómo puede ser eso?

¿Cómo explica matemáticamente la conversión de tipos?

¿Qué es O (nlog (n)) de notación big-O? ¿Cuáles son algunos ejemplos de sus algoritmos?

¿Puede un programa de computadora derivar las matemáticas?

Sistemas distribuidos: ¿Cuál es el significado exacto de A (Disponibilidad) y qué significa en el teorema CAP de Brewer?

¿Ser bueno en matemáticas me ayudaría a ser un mejor programador?

Dadas N monedas, colocadas en una fila, indexadas 1 a N de izquierda a derecha. Inicialmente todas las monedas muestran cabeza. En cada turno, dos enteros, no necesariamente distintos, A y B entre 1 y N (inclusive) se eligen de manera uniforme al azar. Todas las monedas con un índice de A a B (inclusive) se voltean. ¿Cuál es el número esperado de monedas que muestran la cabeza después de que M gira?

Cómo escribir un programa en C para verificar si para cualquier triplete entero (x, y, z) y otro entero n, [matemática] n ^ x + n ^ y = n ^ z [/ matemática] ocurre para (a, b) siendo la entrada donde [matemáticas] a \ leq n \ leq b [/ matemáticas]

Cómo entender Oracle en la complejidad computacional

¿Podemos modificar la máquina de turing?

¿Cómo funciona el software de ajuste de curvas? ¿Cuál es el proceso automático que ajusta una línea compleja en un gráfico a una serie de puntos de datos?

Informática: ¿Son nerds los estudiantes de informática?

¿Cuál es el algoritmo más rápido para encontrar el número más grande en una matriz sin clasificar?