Наливаете 5-литровую емкость полностью, переливаете в 7 литровую. Опять наливаете 5-литровую и доливаете из нее 7-литровую полностью. Теперь у вас в 5-литровой 3 литра. Выливаете 7-литровую и переливаете в нее 3 литра из 5-литровой. Наливаете 5-литровую полностью и доливаете из нее до полной 7-литровую. Теперь у вас в 5-литровой остался один литр. Выливаете 7-литровую, переливаете 1 литр из 5-литровой в 7-литровую, наливаете полную 5-литровую и переливаете в 7-литровую. Теперь у вас там 6 литров.
Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения . Находим дискриминант , если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения , если они натуральные - это и есть ответ.
У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.
Объяснение:
Наливаете 5-литровую емкость полностью, переливаете в 7 литровую. Опять наливаете 5-литровую и доливаете из нее 7-литровую полностью. Теперь у вас в 5-литровой 3 литра. Выливаете 7-литровую и переливаете в нее 3 литра из 5-литровой. Наливаете 5-литровую полностью и доливаете из нее до полной 7-литровую. Теперь у вас в 5-литровой остался один литр. Выливаете 7-литровую, переливаете 1 литр из 5-литровой в 7-литровую, наливаете полную 5-литровую и переливаете в 7-литровую. Теперь у вас там 6 литров.
Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения . Находим дискриминант , если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения , если они натуральные - это и есть ответ.
У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.
#include <iostream>
#include <cmath>
long long isqrt(long long number) {
long long answer = 0, left = 0, right = 1e9;
while (left <= right) {
long long middle = (left + right) / 2;
long long middle_squared = middle * middle;
if (middle_squared == number) {
return middle;
} else if (middle_squared < number) {
answer = middle;
left = middle + 1;
} else {
right = middle - 1;
}
}
return answer;
}
int main() {
long long x, y;
std::cin >> x >> y;
auto d = x * x - 4 * y;
if (d < 0) {
std::cout << 0;
return 0;
}
auto sqrt_d = isqrt(d);
if (sqrt_d * sqrt_d != d) {
std::cout << 0;
return 0;
}
if ((x - sqrt_d) % 2 != 0) {
std::cout << 0;
return 0;
}
std::cout << (x - sqrt_d) / 2 << " " << (x + sqrt_d) / 2;
}