Задача #4374

Задания 19–21

Уровень ЕГЭ

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

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

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

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

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

Ответ

18

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

def moves(a, b):
return [(a + 2, b), (a, b + 2), (2 * a, b), (a, 2 * b)]
def f(a, b, m):
if a + b >= 120 or a * b >= 1000: 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, 46) if f(22, s, 2)]
a20 = [s for s in range(1, 46) if f(22, s, 3) and not f(22, s, 1)]
a21 = [s for s in range(1, 46) if f(22, s, 4) and not f(22, s, 2)]
print('19', min(a19))
print('20', *a20[:2])
print('21', min(a21))

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

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