11057. Важное научное число

 

Пин собирал своё новое, крайне важное изобретение. Однако в какой-то момент он заметил ошибку в одной из формул, из-за чего мог неправильно собрать одну из деталей.

Внимательно изучив деталь и исправив формулу, Пин обнаружил, что в ней установлены две шестерёнки с a и b зубцами соответственно. Чтобы деталь работала правильно, шестерёнки должны иметь размеры a + x и b + x, где x неотрицательное целое число, удовлетворяющее следующим условиям:

·        a + x делится на b;

·        b + x делится на a.

Пин очень устал и просит помочь ему найти наименьшее подходящее значение x. Поскольку он не любит слишком большие шестерёнки, из всех возможных вариантов следует выбрать минимальное.

 

Вход. В одной строке заданы два целых числа a и b (1 ≤ a, b ≤ 109) – размеры шестерёнок в детали.

 

Выход. Выведите одно целое неотрицательное число x – минимальное количество зубцов, которых не хватает шестерёнкам, чтобы изобретение работало правильно.

 

Пример входа 1

Пример выхода 1

8 1

7

 

 

Пример входа 2

Пример выхода 2

3 4

5

 

 

Пример входа 3

Пример выхода 3

123 123

0

 

 

РЕШЕНИЕ

НОД, НОК

 

Анализ алгоритма

Нам известно что:

·        a + x делится на b;

·        b + x делится на a;

Следовательно, a + b + x делится и на a, и на b, что эквивалентно делимости a + b + x на НОК(a, b). То есть существует такое число k, что

a + b + x = k * НОК(a, b)

В качесстве x возьмем НОК(a, b)ab. Однако если это число отрицательное, то вместо него возьмем

x = 2 * НОК(a, b)ab

Очевидно, что a + b 2 * НОК(a, b).

 

Пример

Во втором примере a = 3, b = 4. НОК(3, 4) = 12.

Ответ равен x = НОК(a, b)ab = 12 – 3 – 4 = 5.

 

В третьем примере a = 123, b = 123. НОК(123, 123) = 123.

Ответ равен x = НОК(a, b)ab = 123 123 – 123 = -123. Так как это число отрицательное, то ответом будет

x = 2 * НОК(a, b)ab = 2 * 123 – 123 – 123 = 0

 

Реализация алгоритма

Функция gcd вычисляет наибольший общий делитель чисел a и b.

 

long long gcd(long long a, long long b)

{

  return (!b) ? a : gcd(b, a % b);

}

 

Читаем входные данные.

 

cin >> a >> b;

 

Вычисляем lcm = НОК(a, b) = (a * b) / НОД(a, b).

 

lcm = a / gcd(a, b) * b;

 

Вычисляем ответ.

 

res = lcm - a - b;

if (res < 0) res += lcm;

 

Выводим ответ.

 

cout << res << endl;