El pasado 27 de junio del 2013 en la pagina de cuba http://coj.uci.cu/ se llevo a cabo un concurso progresivo, en este link pueden ver los problemas http://coj.uci.cu/contest/cproblems.xhtml?cid=1301 , fueron 30 problemas a resolverse en 10 días, aquí voy a colocar algunos que se me hicieron interesantes de explicar, hoy explicare el siguiente
2422 – Betty and the Modular Exponentiation
Este problema es relativamente sencillo si se tiene los conocimiento de divide y vencerás y además saber como exponenciar un numero a la n de una forma logarítmica, ya que eso pedían el problema, dado a y b imprimir ya que con eso garantizamos que tenga 9 dígitos, bueno nosotros podemos ver si b es par podemos expresarlo de la siguiente forma
si fuera impar lo podemos expresar de la forma
y sacando siempre el modulo
para obtener el resultado deseado, si nosotros elaboramos una función recursiva que procese
no necesitaríamos volver a calcularlo ya que ese mismo valor lo podes multiplicar por si mismo para obtener
en dado caso que sea impar b hay que volver a multiplicar por a, para que la función regrese siempre
de una forma correcta, este procedimiento lo pueden ver en el siguiente código en la función pot.
/* Autor: Rodrigo Burgos Dominguez*/
# include <stdio.h>
# include <string.h>
# define MOD ((long long)1000000000)
long long pot( long long a, long long b){
long long r;
if( b == 0 ) return 1;
if( b == 1 ) return a % MOD;
r = pot( a , b / 2);
r = (r * r ) % MOD;
if(b % 2 == 1) r = (r * a) % MOD;
return r;
}
main(){
int ncases, cases, a, b;
for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++){
scanf("%d %d", &a, &b);
printf("%lld\n", pot(((long long)a)%MOD, (long long)b));
}
return 0;
}
Deja un comentario