Есть две
коробки. В первой находится a шаров,
во второй b (0 < a + b
< 2147483648). Шары разрешается перекладывать из одной коробки в другую.
Причем перекладывать в любую из коробок можно только столько шаров, сколько в
ней находится. Необходимо определить, можно ли все шары сложить в одну коробку.
Вход. Каждая строка содержит два целых числа a и b,
разделенных пробелом.
Выход. Для каждого
теста в отдельной строке вывести количество перекладываний, необходимое для
того чтобы все шары находились в одной коробке, или -1, если это сделать
невозможно.
Пример
входа |
Пример
выхода |
2 6 8 12 7 9 |
2 -1 4 |
РЕШЕНИЕ
математика - НОД
Все шары можно переложить в одну коробку
тогда и только тогда, когда
a + b = НОД (a, b)
* 2k
для некоторого
натурального k. Если указанное
равенство не выполняется, то выводим -1. Иначе моделируем процесс
перекладывания шаров, как указано в условии задачи.
Функция move моделирует процесс перекладывания шаров и возвращает количество
перекладываний, после выполнения которых все шары будут находиться в одной
коробке.
int move(int a, int b)
{
if (a == 0
|| b == 0) return 0;
if (a > b) return move(a - b, 2 * b) + 1;
return move(2 * a, b - a) + 1;
}
Проверяем, можно ли шары переложить в одну коробку. Для этого
проверяем выполнение равенства a + b = НОД (a, b) * 2k для некоторого натурального k.
int Can(int
a, int b)
{
int res = (a
+ b) / gcd(a,b);
while(res % 2
== 0) res /= 2;
return res ==
1;
}
Основная часть программы. Читаем входные данные и выводим результат.
while (scanf("%d %d", &a, &b) ==
2)
if (Can(a, b)) printf("%d\n", move(a, b));
else printf("-1\n");