Задание №19 — Теория игр
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 129. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 129 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 128.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Правильный ответ
64
Пояснение
Решение:
Нужно найти наименьшее , для которого выполняются сразу два требования: Петя не выигрывает первым же ходом, а Ваня выигрывает своим первым ходом при любом ходе Пети.
Первое требование. Петя выигрывает сразу, если или . Значит, «не выиграть за один ход» означает и , то есть .
Второе требование. Из кучи в камней игрок выигрывает одним ходом, если или ; при это равносильно (тогда удвоение сразу даёт не меньше 130). После хода Пети в куче окажется или , и оба этих числа должны быть не меньше 65: даёт , а даёт . Более сильное из них — .
Оба требования выполняются одновременно только при . Проверка: Петя из 64 может получить 65 или 128 — игра не кончается; из 65 Ваня удваивает и получает 130, из 128 добавляет камень и получает 129. В обоих случаях Ваня побеждает своим первым ходом.
def win_now(s): # можно ли выиграть одним ходом из s
return s + 1 >= 129 or 2 * s >= 129
for s in range(1, 129):
if not win_now(s) and all(win_now(m) for m in (s + 1, 2 * s)):
print(s) # 64
break
Ответ: 64