Задача A. Правильная окраска

Автор:Г. Гренкин   Ограничение времени:1 сек
Входной файл:input.txt   Ограничение памяти:256 Мб
Выходной файл:output.txt  

Условие

По мотивам романа И.А. Ильфа и Е.П. Петрова "Двенадцать стульев".

Для окраски волос Ипполит Матвеевич Воробьянинов купил в аптеке замечательное средство "Титаник" радикального черного цвета. Возвратившись домой, Ипполит Матвеевич стал поливать голову и усы "Титаником".

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

Проснувшись на другой день, Ипполит Матвеевич стал умываться. Но, посмотрев в зеркало, он обнаружил, что его усы и волосы были зелёного цвета.

Его компаньон Остап Бендер купил в аптеке другую микстуру "Наяда". Но после перекраски оказалось, что, смешавшись с зеленью "Титаника", это средство неожиданно окрасило голову и усы Ипполита Матвеевича в краски солнечного спектра. После скептического осмотра Остап предложил Воробьянинову сбрить усы и волосы.

Всё могло бы быть иначе, если бы концессионеры точно рассчитали цвет второго флакона. Посмотрим, как можно это сделать.

Наряду с аддитивной цветовой моделью RGB, используемой для кодирования цветов пикселей экрана, существует и субтрактивная модель RYB, которая применяется для представления цвета в изобразительном искусстве. Для задания цвета в этой модели нужно указать количество красного, желтого и синего цвета как число от 0 до 1. Так, 100 — это красный цвет, 001 — синий, 111 — чёрный, а 110 — оранжевый.

Модель RYB позволяет легко найти цвет смеси двух красок. При смешивании цветов (r1, y1, b1) и (r2, y2, b2) получается цвет (r3, y3, b3), где r3 = (r1 + r2) / k, y3 = (y1 + y2) / k, b3 = (b1 + b2) / k. Здесь k = max{r1 + r2, y1 + y2, b1 + b2}.

Даны цвета (r1, y1, b1) и (r3, y3, b3). С каким цветом (r2, y2, b2) нужно смешать первый цвет, чтобы получить третий цвет?

Формат входного файла

Первая строка входного файла содержит вещественные числа r1 y1 b1. Вторая строка содержит вещественные числа r3 y3 b3.

Хотя бы одно из чисел в каждой тройке равно 1.

Во входных данных не более 2-х знаков после запятой.

Формат выходного файла

Требуется вывести в выходной файл вещественные числа r2 y2 b2 с точностью не менее 5 знаков после запятой.

Все числа должны быть в диапазоне от 0 до 1, и хотя бы одно из чисел должно быть равно 1.

Ограничения

0 ≤ r1, y1, b1, r3, y3, b3 ≤ 1

Гарантируется, что для заданных исходных данных задача имеет решение.

Примеры тестов

Входной файл (input.txt) Выходной файл (output.txt)
1
1 0 0
1 1 0
0.00000 1.00000 0.00000 
2
1 0.5 0
1 1 0
0.50000 1.00000 0.00000 
3
0.25 1 0.5
0.5 0.75 1
0.50000 0.12500 1.00000 

Разбор

Предположим, что r2 = 1. Тогда из соотношения r3 = (r1 + r2) / k найдём k = r1 + 1r3, и тогда найдём остальные числа тройки: r2 = 1, y2 = r1 + 1r3y3 − y1, b2 = r1 + 1r3b3 − b1.

Далее нужно проверить, что 0 ≤ y2, b2 ≤ 1. Если это не так, то положим y2 = 1 и повторим аналогичную процедуру. Если мы опять не получили решение, то положим b2 = 1.

Докажем единственность решения. Предположим, что, когда мы положили r2 = 1 и y2 = 1, в обоих случаях выполняется неравенство 0 ≤ r2, y2, b2 ≤ 1. Это означает, что r1 + 1r3y3 − y1 ≤ 1 и y1 + 1y3r3 − r1 ≤ 1. Отсюда (r1 + 1)y3 ≤ (y1 + 1)r3 и (y1 + 1)r3 ≤ (r1 + 1)y3, поэтому (r1 + 1)y3 = (y1 + 1)r3. Следовательно, в обоих случаях r2 = y2 = 1, поэтому оба случая тождественны.

Пример решения:

var
  c1, c2, c3: array[1..3] of extended;
  k: extended;
  i, j: integer;
  ok: boolean;
begin
  assign(input, 'input.txt');
  reset(input);
  assign(output, 'output.txt');
  rewrite(output);

  ok := false;
  for i := 1 to 3 do
    read(c1[i]);
  for i := 1 to 3 do
    read(c3[i]);

  for i := 1 to 3 do
  begin
    if (c3[i] > 0) then
    begin
      c2[i] := 1;
      k := (c1[i] + 1)/c3[i];
      ok := true;
      for j := 1 to 3 do
      begin
        if (j <> i) then
        begin
          c2[j] := k*c3[j] - c1[j];
          if not ((c2[j] >= -1e-10) and (c2[j] <= 1+1e-10)) then
            ok := false;
        end;
      end;
      if ok then
        break;
    end;
  end;

  for i := 1 to 3 do
    write(c2[i]:0:5, ' ');

  close(input);
  close(output);
end.

0.092s 0.012s 13