10812. Победить распространение

 

В воскресенье будут проходить две игры. Принимаются ставки на сумму и разность их счетов. По выигрышным числам определить счет встреч.

 

Вход. Первая строка содержит количество тестов n. Каждая следующая строка содержит два неотрицательных числа x и y, представляющие собой сумму и разность (взятую по модулю) двух окончательных счетов матчей.

 

Выход. Для каждого теста вывести в отдельной строке счета встреч, начиная с наибольшего. Если таких счетов не существует, вывести «impossible».

 

Пример входа

2
40 20
20 40

 

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

30 10
impossible
 

 

РЕШЕНИЕ

математика

 

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

Пусть a и b – конечные искомые счета, a > b. Из условия задачи следует, что . Решая систему уравнений, получим: , откуда  . Если x < y, то b получится отрицательным, что невозможно. Значения a и b являются целыми, следовательно x + y должно быть четным числом.

 

Пример

Для первого теста x = 40, y = 20.  Искомые счета равны: a = (40 + 20) / 2 = 30, b = (40 – 20) / 2 = 10, оба они целые и неотрицательные.

 

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

Читаем количество тестов. Для каждого теста вычисляем конечные счета a и b по выше приведенным формулам. Если сумма счетов меньше разности или сумма счетов не делится на 2, то искомых счетов не существует, и в таком случае выводим сообщение impossible. Иначе печатаем результат.

 

scanf("%d",&tests);

for(i = 0; i < tests; i++)

{

  scanf("%d %d",&x,&y);

  a = (x + y) / 2;

  b = (x - y) / 2;

  if ((x < y) || ((x + y) % 2)) printf("impossible\n");

  else printf("%d %d\n",a,b);

}