e-olymp 2071. Три грибника

Задача

Три грибника

Три грибника

Три грибника Петя, Вася и Николай, возвращаясь из лесу домой, решили устроить привал, а заодно и перекусить. Как это у нас принято, через некоторое время каждый начал сначала хвастаться своими сегодняшними успехами, а со временем, а так все трое были друзьями, то вскоре начали делить найденными ими грибы между собой и своими товарищами.

Сначала Пётр дал Васе и Николаю по столько грибов, сколько у них уже было. Николай быстро понял, что так будет не по-братски, и дал Василию и Петру по столько грибов, по сколько у них стало. Василий не мог отстать от сотоварищей и также дал каждому из друзей по столько грибов, сколько у них этому моменту имелось. И тут друзья с удивлением обнаружили, что у всех стало грибов поровну.

Сколько грибов было у каждого перед привалом, если известно, что все вместе они собрали [latex]n[/latex] грибов?

Входные данные

В единственной строке находится единственное натуральное число [latex]n[/latex] ([latex]n ≤ 30000[/latex]).

Выходные данные

В единственной строке вывести через пробел количество грибов перед привалом у Петра, Василия и Николая, соответственно. Гарантируется, что все входные данные корректны.

Тесты

Входные данные
Выходные данные
[latex]24[/latex] [latex]13[/latex] [latex]4[/latex] [latex]7[/latex]
[latex]48[/latex] [latex]26[/latex] [latex]8[/latex] [latex]14[/latex]
[latex]72[/latex] [latex]39[/latex] [latex]12[/latex] [latex]21[/latex]
[latex]96[/latex] [latex]52[/latex] [latex]16[/latex] [latex]28[/latex]
[latex]120[/latex] [latex]65[/latex] [latex]20[/latex] [latex]35[/latex]
[latex]144[/latex] [latex]78[/latex] [latex]24[/latex] [latex]42[/latex]

Код программы

Решение задачи

Представим нашу задачу в форме таблицы, строки которой будут соответствовать грибникам, а столбцы — количеству грибов у соответствующего грибника между обменами:

П.
[latex]x_{1}[/latex] [latex]x_{2} = x_{1} — y_{1} — z_{1}[/latex] [latex]x_{3} = 2 \cdot x_{2}[/latex] [latex]x_{4} = 2 \cdot x_{3}[/latex]
В.
[latex]y_{1}[/latex] [latex]y_{2} = 2 \cdot y_{1}[/latex] [latex]y_{3} = 2 \cdot y_{2}[/latex] [latex]y_{4} = y_{3} — x_{3} — z_{3}[/latex]
Н.
[latex]z_{1}[/latex] [latex]z_{2} = 2 \cdot z_{1}[/latex] [latex]z_{3} = z_{2} — x_{2} — y_{2}[/latex] [latex]z_{4} = 2 \cdot x_{3}[/latex]

По условию задачи [latex]x_{4} = y_{4} = z_{4} = \frac n 3[/latex]. Тогда выражением нужных корней и подстановкой известных считаем [latex]x_{1}[/latex], [latex]y_{1}[/latex] и [latex]z_{1}[/latex] начиная с правого столбца и двигаясь налево:

[latex]x_{3} = \frac {x_{4}}{2} = \frac {n}{6}[/latex]
[latex]z_{3} = \frac {z_{4}}{2} = \frac {n}{6}[/latex]
[latex]y_{3} = y_{4} + x_{3} + z_{3}= \frac {n}{3} + \frac {n}{6} + \frac {n}{6} = \frac {2 \cdot n}{6}[/latex]
[latex]x_{2} = \frac {x_3}{2} = \frac {n} {12}[/latex]
[latex]y_{2} = \frac {y_3}{2} = \frac {n}{3}[/latex]
[latex]z_{2} = z_{3} + y_{2} + x_{2} = \frac {n}{6} + \frac {n}{12} + \frac {n}{3} = \frac {7 \cdot n}{12}[/latex]
[latex]y_{1} = \frac {y_{2}}{2} = \frac {n}{6}[/latex]
[latex]z_{1} = \frac {z_2}{2} = \frac {7 \cdot n}{24}[/latex]
[latex]x_{1} = x_{2} + y_{1} + z_{1} = \frac {n}{12} + \frac {n}{6} + \frac {6 \cdot n}{12} = \frac {13 \cdot n}{24}[/latex]

Получили ответы: [latex]x_{1} = \frac {13 \cdot n}{24}[/latex],  [latex]y_{1} = \frac {n}{6}[/latex] и [latex]z_{1} = \frac {7 \cdot n}{24}[/latex]. Это и будет количество грибов соответственно у Пети, Васи и Николая в самом начале. Отсюда получаем итоговую формулу решения, указанную в коде программы.

Ссылки

Условие задачи на e-olymp
Код решения на ideone.com

Related Images:

Ю2.4

Задача: Числа [latex]a, b, c[/latex] тогда и только тогда являются сторонами треугольника, когда существуют такие положительные [latex]x, y, z[/latex], что:

[latex]\begin{cases}& \text{ } a=x+y \\& \text{ } b=y+z \\& \text{ } c=x+z\end{cases}[/latex]

[latex]a[/latex] [latex]b[/latex] [latex]c[/latex] [latex]x[/latex] [latex]y[/latex] [latex]z[/latex] Комментарий
10 5 7 6 4 1 Выполняется
3.5 6.8 4 0.35 3.15 3.65 Выполняется
-5 7 3  — Не треугольник
17 4 8  — Не треугольник

C++:

Java:

Для всех переменных ( [latex]a, b, c[/latex] — даны по условию, [latex]x, y, z[/latex] — нужно найти) я использовала тип данных double, так как числа могут быть вещественными.

[latex]a, b, c[/latex] — стороны треугольника, поэтому они не могут быть отрицательными. И по соотношениям между сторонами треугольника каждая сторона меньше суммы двух других сторон. В противном случае [latex]a, b, c[/latex] не являются сторонами треугольника.

Чтобы получить значения [latex]x, y, z[/latex], решаем систему, данную в условии. Из первого уравнения: [latex]x=a-y[/latex]. Из второго: [latex]z=b-y[/latex]. Подставляем [latex]x=a-y[/latex] и [latex]z=b-y[/latex] в третье уравнение: [latex]c=a+b-2\cdot y[/latex]. Находим [latex]y=\frac{a+b-c}{2}[/latex], [latex]x=a-y[/latex], [latex]z=b-y[/latex].

Задача на Ideone:
C++
Java

Related Images:

А50

Задача А50. Даны действительные числа [latex]a_{1}[/latex], [latex]b_{1}[/latex], [latex]c_{1}[/latex], [latex]a_{2}[/latex], [latex]b_{2}[/latex], [latex]c_{2}[/latex]. Выяснить, верно ли что [latex]\left|a_{1} b_{2} -a_{2} b_{1} \right|\geq 0.0001[/latex], и если верно, то найти решение системы линейных уравнений

[latex]a_{1} x+b_{1} y+c_{1} =0[/latex],

[latex]a_{2} x+b_{2} y+c_{2} =0[/latex]

(при выполнении выписанного неравенства система заведомо совместна и имеет единственное решение).

[latex]a_{1}[/latex] [latex]b_{1}[/latex] [latex]c_{1}[/latex] [latex]a_{2}[/latex] [latex]b_{2}[/latex] [latex]c_{2}[/latex] [latex]x[/latex] [latex]y[/latex] Комментарий.
 3,8  5  -2  6  8,4  3  16,5625  -12,1875  Тест пройден.
 0 4  5  2  0  9  -4,5  -1,25  Тест пройден.
 1 2  -3  3  2  -1  -1  2  Тест пройден.
 1  0.00002  5  2  0.00005  8  —  —  Тест не пройден. Неравенство не выполняется.
 1  4  5  2  8  3  —  —  Тест не пройден. Неравенство не выполняется.

Код программы (C++):

Java:

 

По условию задачи необходимо решить систему линейных уравнений и вывести на экран [latex]x[/latex], [latex]y[/latex].

Программа решает это уравнение по методу Гаусса.

Изначально она делает проверку на наличие ненулевого аргумента [latex]a_{1}[/latex]. Если таковой имеется, то программа решает задачу, исходя из первого уравнения системы, в противном случае — решение начинается со второго уравнения.

Далее я ввела в программу переменные [latex]b_{0}[/latex], [latex]c_{0}[/latex], чтобы не перегружать формулы большим количеством данных. Алгоритм действий таков:

1) Перенести  [latex]c_{1}[/latex] и  [latex]c_{2}[/latex] в правую часть уравнения, что автоматически меняет их знак на противоположный.

2) Если в программе присутствует ненулевой аргумент [latex]a_{1}[/latex], то она вычитает из второго уравнения первое, предварительно домножив второе на [latex]\frac{b_{1} a_{2} }{a_{1} }[/latex].

3) Из преобразованного второго уравнения находится [latex]y[/latex], который впоследствии подставляется в первое уравнение системы для нахождения [latex]x[/latex] .

Для выполнения программы и проверки тестов можно воспользоваться следующим объектом (C++) и этим (Java).

Related Images: