Grade 9 · Divisibility and prime numbersCitește în română
Least common multiple
Original: Cel mai mic multiplu comun
O(log n)C++1735 lines2 examples
The idea
We use the relation gcd(a, b) * lcm(a, b) = a * b. We compute the GCD with Euclid's algorithm on copies of a and b, then lcm = a / gcd * b (we divide first so that we do not overflow the type).
Original description (Romanian)
Se folosește relația cmmdc(a, b) * cmmmc(a, b) = a * b. Calculăm cmmdc-ul cu algoritmul lui Euclid, pe copii ale lui a și b, apoi cmmmc = a / cmmdc * b (împărțim întâi, ca să nu depășim tipul).
- Complexity
- O(log(min(a, b)))
- Grade
- Grade 9 (Clasa a IX-a)
Examples
Example 1
Input
12 18
Expected output
36
Example 2
Input
7 5
Expected output
35
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Cel mai mic multiplu comun
* Clasa: 9
* Capitol: Divizibilitate și numere prime
* Descriere: Se folosește relația cmmdc(a, b) * cmmmc(a, b) = a * b. Calculăm
* cmmdc-ul cu algoritmul lui Euclid, pe copii ale lui a și b, apoi
* cmmmc = a / cmmdc * b (împărțim întâi, ca să nu depășim tipul).
* Complexitate: O(log(min(a, b)))
*
* Exemplu
* Intrare: 12 18
* Ieșire: 36
*
* Exemplu
* Intrare: 7 5
* Ieșire: 35
*/
#include <iostream>
using namespace std;
int main()
{
long long a, b;
cin >> a >> b;
long long x = a, y = b;
while (y != 0)
{
long long r = x % y;
x = y;
y = r;
}
cout << a / x * b << '\n';
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.