Dados dos números n y m, evalúe la torre de energía infinita:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Tenga en cuenta que ^ es asociativo correcto. Entonces 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Ahora, ¿cómo puede asignar un valor a una secuencia infinita de operadores asociativos a la derecha?
Defina f (n, m, i) como la torre de energía que contiene los primeros términos i de la torre de energía infinita. Entonces hay una constante C tal que para cada i> C, f (n, m, i) = f (n, m, C). Entonces se podría decir que la torre de energía infinita converge en un cierto valor. Estamos interesados en ese valor.
Su programa debe poder calcular n = 2017, m = 10 ^ 10 en menos de 10 segundos en una PC moderna razonable. Es decir, debe implementar un algoritmo real, sin fuerza bruta.
Es posible suponer que n <2 30 y m <2 50 para los límites numéricos en su lenguaje de programación, pero su algoritmo debe teóricamente trabajo para cualquier tamaño n , m . Sin embargo, su programa debe ser correcto para las entradas dentro de estos límites de tamaño, los desbordamientos de valores intermedios no están justificados si las entradas están dentro de estos límites.
Ejemplos:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
fuente
n
ym
se no garantiza que sea co-prime.