Разбор
Рассмотрим, какие значения принимает выражение , где при фиксированных и . Например, .
Рассмотрим, например, функцию . Тогда
Согласно расширенному алгоритму Евклида, всегда существуют такие целые и , что . Следовательно, наименьшим положительным значением, которое может принимать выражение , является . Отсюда следует, что это выражение может принимать все возможные значения вида , где .
Теорема. Если , то эта функция принимает значения вида , где .
Доказательство. Действительно,
Поскольку числа и являются взаимно простыми, то всегда существуют такие и , что числитель дроби равен . Следовательно, функция может принимать все возможные значения вида , где .
Теперь рассмотрим исходную функцию
Ее значения — расстояния от точки до ближайшей точки вида . Для максимизации функции значение следует выбрать таким образом, чтобы оно находилось точно посередине между соседними точками и , где — целое число. Значение функции в такой точке равно , что и будет ответом.
Пример
Пусть . Очевидно, что . Равенство справедливо, так как существуют такие и , что (например, ). Из этого также следует, что , где .
Однако , и это будет наибольшим значением функции, так как точка находится на максимальном расстоянии от нулей функции.
Реализация алгоритма
Функция gcd вычисляет наибольший общий делитель чисел и .
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
Функция lcm вычисляет наименьшее общее кратное чисел и .
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
Основная часть программы. Читаем входные данные.
while (scanf("%lld %lld", &n, &m) == 2) {
Вычисляем и выводим ответ.
d = 2 * lcm(n, m); printf("%lld/%lld\n", 1, d); }