Étant donné 3 nombres x, n et m, vous devez calculer la valeur de .
Entrée
La seule ligne d’entrée contient 3 entiers x, n et m (1 ≤ x, n, m ≤ ).
Sortie
Le programme doit afficher le résultat de l’expression .
Exemples
Entrée
Sortie
2 10 5
4
Explication
2^10 = 1024 ⇒ 1024 mod 5 = 4
Tutoriel
Comme tous les nombres peuvent être très grands, il est nécessaire d’utiliser un algorithme rapide pour s’assurer qu’il s’exécute suffisamment vite. L’exponentiation binaire est un moyen efficace de calculer des puissances élevées d’un nombre. Cette méthode réduit le nombre de multiplications nécessaires pour trouver la puissance, ce qui la rend plus rapide que la méthode traditionnelle consistant à boucler de 1 jusqu’à n et à multiplier le résultat par x.
L’algorithme d’exponentiation binaire repose sur l’observation mathématique suivante : si on a un nombre x élevé à la puissance n, alors peut se représenter ainsi :
si n est pair
si n est impair
Cela accélère considérablement le calcul, car on peut d’abord calculer une seule fois , puis multiplier les résultats entre eux. L’algorithme peut donc ressembler à ceci :
def binpow(x, n, m):
if n == 0: # Cas de base : x^0 = 1
return 1
if n % 2 == 0: # n est pair ⇒ on calcule la moitié puis on multiplie
half = binpow(x, n // 2, m) # on calcule la moitié
return (half * half) % m # res = x^(n/2) * x^(n/2)
# n est impair ⇒ res = x * x^(n-1)
return (x * binpow(x, n - 1, m)) % m
Grâce à l’exponentiation binaire, on réduit la complexité en passant de à , car on divise n par 2 à chaque itération lorsque n est pair. Il est important de noter qu’à chaque fois que n est impair, l’itération suivante se fait ensuite sur n - 1, qui est pair.