Задача #4376

Задания 19–21

Уровень ЕГЭ

Общее условие для 19–21

(А. Шуруха) Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
— добавить в одну из куч (по своему выбору) 5 камней;
— увеличить количество камней в одной из куч (по своему выбору) в 2 раза.
Например, пусть в одной куче 20 камней, а в другой 30 камней; такую позицию в игре обозначим (20, 30). Тогда за один ход можно получить любую из четырёх позиций: (25, 30), (20, 35), (40, 30), (20, 60). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда разность количеств камней в двух кучах становится не менее 40, то есть когда из большего количества камней можно вычесть меньшее и получить 40 или больше. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, в которой кучи различаются на 40 камней или больше. В начальный момент в первой куче было 30 камней, во второй куче — S камней; 1 ≤ S ≤ 69. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Вопрос для задания 20

Для игры, описанной в задании 19, найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.

Ответ
Новая
Войдите, чтобы история ответов и статистика сохранялись.
Решение Нажми, чтобы открыть Нажми, чтобы скрыть

Ответ

25
33

Общий разбор связки

def moves(a, b):
return [(a + 5, b), (a, b + 5), (2 * a, b), (a, 2 * b)]
def f(a, b, m):
if abs(a - b) >= 40: return m % 2 == 0
if m == 0: return False
h = [f(x, y, m - 1) for x, y in moves(a, b)]
return any(h) if m % 2 else all(h)

a19 = [s for s in range(1, 70) if f(30, s, 2)]
a20 = [s for s in range(1, 70) if f(30, s, 3) and not f(30, s, 1)]
a21 = [s for s in range(1, 70) if f(30, s, 4) and not f(30, s, 2)]
print('19', min(a19))
print('20', *a20[:2])
print('21', min(a21))

Решение для задания 20

Быстрый переход
Перейти к задаче