Calcular el resto de ab en la división por m. Acá, el número b puede ser muy grande, y sin embargo la respuesta no, ya que calculamos el resto en la división por m.
La idea es aprovechar el hecho de que ab=(a2)b/2. Vamos a implemente una función recursiva que eleve al cuadrado la base (haciendo simplemente la cuentita) y divida por dos el exponente. El único cuidado que hay que tener es que si b es impar, al hacer b/2 estamos agarrando la parte entera de esa división, entonces tenemos que multiplicar por un a más.
int my_pow(int a, int b, int m){ if(b==0){ return 1; }else{ if(b%2==0){ return my_pow(a*a%m, b/2, m)%m; }else{ return (a*my_pow(a*a%m, b/2, m))%m; } } }
Si m es grande, tanto como para que a∗a se pueda pasar del valor máximo de int, se recomienda usar long long int en esta función, o tener sumo cuidado (se pueden hacer cosas como 1LL*..., es decir, convertir a long long en el momento de un producto y luego al hacer %m el número vuelve a entrar en int).