Étant donné deux nombres n et m, évaluez la tour de puissance infinie:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Gardez à l'esprit que ^ est associatif à droite. Donc 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Maintenant, comment pouvez-vous éventuellement attribuer une valeur à une séquence infinie d'opérateurs associatifs à droite?
Définissez f (n, m, i) comme la tour de puissance contenant les i premiers termes de la tour de puissance infinie. Ensuite, il y a une constante C telle que pour chaque i> C, f (n, m, i) = f (n, m, C). On pourrait donc dire que la tour de puissance infinie converge vers une certaine valeur. Nous sommes intéressés par cette valeur.
Votre programme doit être capable de calculer n = 2017, m = 10 ^ 10 en moins de 10 secondes sur un PC moderne raisonnable. Autrement dit, vous devez implémenter un algorithme réel, pas de bruteforcing.
Vous pouvez supposer que n <2 30 et m <2 50 pour les limites numériques de votre langage de programmation, mais votre algorithme doit théoriquement fonctionner pour n'importe quelle taille n , m . Cependant, votre programme doit être correct pour les entrées dans ces limites de taille, les débordements de valeurs intermédiaires ne sont pas excusés si les entrées sont dans ces limites.
Exemples:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
n
et nem
sont pas garantis d'être co-prime.