Medio · teoría de números
Mínimo común múltiplo
Ya tienes gcd de Máximo común divisor. El MCM es solo a / gcd(a,b) * b — pero el orden importa, o el producto se desborda.
En una fraseEl MCM es a / gcd(a, b) * b: divide antes de multiplicar; con 10⁴ el producto aún cabría, pero ese hábito es lo que lo mantiene correcto cuando las entradas crecen.
El problema
Entrada: dos líneas, cada una con un entero: a y luego b (1 ≤ a, b ≤ 10000).
Salida: su mínimo común múltiplo.
Ejemplos:
| Entrada | Salida |
|---|---|
4 | 12 |
3 | 15 |
12 | 36 |
Tu solución
Entrada personalizada para «Ejecutar mi entrada»
La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.
¿Atascado? Pistas
Pista 1 — la fórmula
mcm(a,b) = a * b / mcd(a,b). Pero escríbelo como a / mcd(a,b) * b — dividir primero mantiene pequeño el valor intermedio, así no desborda un int de 32 bits en estos rangos.
Pista 2 — números iguales
Si a == b, la respuesta es simplemente a — y la fórmula también la da, sin caso especial. Ojo con el orden: a / mcd * b es aritmética entera, así que divide antes de multiplicar.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
long long gcd(long long a, long long b) {
while (b) {
long long t = a % b;
a = b;
b = t;
}
return a;
}
int main() {
long long a, b;
cin >> a >> b;
cout << a / gcd(a, b) * b << endl;
return 0;
}
Ahora puedes escalar: cuántos múltiplos de k caben entre dos límites, o simplificar una fracción con mcd y luego encontrar un denominador común con mcm. Siguiente: Número de Armstrong.
Análisis profundo
Por qué funciona
La identidad a * b = mcd(a,b) * mcm(a,b) es todo el truco: con el MCD, el MCM queda a una división de distancia. Sin recorrer múltiplos ni adivinar.
El coste
O(log min(a,b)) de tiempo, igual que el MCD de Euclides. O(1) de espacio. El orden a / mcd * b mantiene el intermedio dentro de 32 bits para estas entradas.
Dónde falla
- Escribir
a * b / mcd(a,b)multiplica primero; con a y b grandes ese intermedio desborda el int y la respuesta sale negativa. - Si en el MCD inviertes el orden
a = b; b = a % bsin guardar antes el resto, puedes entrar en bucle infinito o devolver 0.
Siguiente paso
La misma función con otro uso: simplificar una fracción dividiendo ambos términos por el MCD. Número de Armstrong da la vuelta a la idea de dígitos y potencias.
Dos cosas para recordar
- mcm(a,b) = a / mcd(a,b) * b — divide antes de multiplicar.
- El MCD de Euclides es la herramienta reutilizable; casi todo problema de números está a una llamada de distancia.
🐞 Esta versión falla: ábrela y pruébala
Imprime el producto y no el MCM: 4 6 da 24 y el juez quiere 12
#include <iostream>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
cout << a * b << endl; // product, not lcm
return 0;
}