Berechnen Sie mit zwei Zahlen n und m den unendlichen Machtturm:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Denken Sie daran, dass ^ rechtsassoziativ ist. Also 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Wie kann man nun einer unendlichen Folge von rechtsassoziativen Operatoren einen Wert zuweisen?
Definiere f (n, m, i) als den Kraftturm, der die ersten i Terme des unendlichen Kraftturms enthält. Dann gibt es eine solche Konstante C, dass für jedes i> C f (n, m, i) = f (n, m, C) ist. Man könnte also sagen, dass der unendliche Kraftturm sich einem bestimmten Wert annähert. Dieser Wert interessiert uns.
Ihr Programm muss in der Lage sein, n = 2017, m = 10 ^ 10 in weniger als 10 Sekunden auf einem vernünftigen modernen PC zu berechnen. Das heißt, Sie sollten einen tatsächlichen Algorithmus implementieren, kein Bruteforcing.
Sie können annehmen, dass n <2 30 und m <2 50 für die numerischen Grenzen in Ihrer Programmiersprache sind, aber Ihr Algorithmus muss theoretisch für jede Größe von n , m funktionieren . Ihr Programm muss jedoch für Eingaben innerhalb dieser Größengrenzen korrekt sein. Zwischenwertüberläufe werden nicht entschuldigt, wenn die Eingaben innerhalb dieser Grenzen liegen.
Beispiele:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
n
undm
ist nicht als Co-Prime garantiert.