2422 – Betty and the Modular Exponentiation – Concurso progresivo COJ 27 JUN 2013

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 a^b\enspace mod \enspace 1000000000 ya que con eso garantizamos que tenga 9 dígitos, bueno nosotros podemos ver si b es par podemos expresarlo de la siguiente forma a^{b/2} * a^{b/2} si fuera impar lo podemos expresar de la forma a^{b/2} * a^{b/2} * a y sacando siempre el modulo 10^9 para obtener el resultado deseado, si nosotros elaboramos una función recursiva que procese a^{b/2} no necesitaríamos volver a calcularlo ya que ese mismo valor lo podes multiplicar por si mismo para obtener a^b en dado caso que sea impar b hay que volver a multiplicar por a, para que la función regrese siempre a^b 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