Processing math: 100%

Tabla de Contenidos

Enunciado

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.

Idea

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.

Código

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 aa 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).