Dati due numeri n e m, valuta la torre di potenza infinita:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Tieni presente che ^ è associativo. Quindi 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Ora come puoi eventualmente assegnare un valore a una sequenza infinita di operatori associativi a destra?
Definisci f (n, m, i) come la torre di potere contenente i primi termini della torre di potere infinita. Quindi c'è una costante C tale che per ogni i> C, f (n, m, i) = f (n, m, C). Quindi si potrebbe dire che la torre di potenza infinita converge su un certo valore. Siamo interessati a quel valore.
Il tuo programma deve essere in grado di calcolare n = 2017, m = 10 ^ 10 in meno di 10 secondi su un PC moderno ragionevole. Cioè, dovresti implementare un vero algoritmo, senza bruteforcing.
Puoi supporre che n <2 30 e m <2 50 per i limiti numerici nel tuo linguaggio di programmazione, ma il tuo algoritmo deve teoricamente funzionare per qualsiasi dimensione n , m . Tuttavia, il programma deve essere corretto per gli input entro questi limiti di dimensione, gli overflow di valori intermedi non sono giustificati se gli input sono entro questi limiti.
Esempi:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
n
em
sono , non garantito per essere co-prime.