Problema E: MCDFAC
Descargar problema: UNMSM-FISI 2011 Problema E
import java.io.*; public class ProblemaE { public static void main( String args[] ) throws Exception { BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) ); int numCasos; // Cantidad de casos a analizar int a, b; // Par de valores a analizar int mcd; // MCD int[] exp; int limite; // Limite hasta donde se buscaran divisores String[] valores; numCasos = Integer.parseInt( br.readLine() ); for( int i = 0; i < numCasos; i ++ ) { // Leemos los valores de entrada valores = br.readLine().split( " " ); a = Integer.parseInt( valores[ 0 ] ); b = Integer.parseInt( valores[ 1 ] ); mcd = 1; // Verificamos si el segundo es multiplo de 2 if( b % 2 == 0 ) { exp = factor( b, 2 ); b = exp[ 0 ]; // Calculamos el menor exponente de 2, en los 2 numeros mcd = (int)Math.pow( 2, Math.min( exp[ 1 ], maximo( a, 2 ) ) ); } // Numero maximo que puede ser divisor de 'b' limite = (int)Math.sqrt( b ); for( int j = 3; j <= limite; j = j + 2 ) { // Buscamos los siguientes divisores de 'b' if( b % j == 0 ) { exp = factor( b, j ); b = exp[ 0 ]; // Calculamos el menor exponente de 'j' en los 2 numeros mcd *= Math.pow( j, Math.min( exp[ 1 ], maximo( a, j))); // Calculamos el nuevo limite limite = (int)Math.sqrt( b ); } } // Si el resto es diferente de 1, es un primo, lo añadimos al MCD if( b != 1 && b <= a ) mcd *= b; System.out.println( "Caso #" + (i+1) + ": " + mcd ); } } // Calcula el exponente de 'divisor' en la descomposicion canonica de 'n' public static int[] factor( int n, int divisor ) { int[] exp = { n, 0 }; while( exp[ 0 ] % divisor == 0 ) { exp[ 1 ] ++; exp[ 0 ] /= divisor; } return exp; } // Calcula el exponente de 'divisor' en la descomposicion canonica de n! public static int maximo( int n, int divisor ) { int maximo = 0; while( n >= divisor ) { n = n/divisor; maximo += n; } return maximo; } }