Задание №19 — Теория игр
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 153. Победителем считается игрок, сделавший последний ход, т. е. первым получивший кучу из 153 или больше камней. В начальный момент в куче было S камней, 1S152. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Правильный ответ
76
Пояснение
Решение:
Из кучи в камней ход «добавить камень» даёт , ход «удвоить» даёт . Так как при любом , выиграть одним ходом можно тогда и только тогда, когда , то есть при .
Поэтому условие «Петя не может выиграть за один ход» означает .
Дальше нужно, чтобы любой ход Пети приводил к куче, из которой Ваня выигрывает одним ходом, то есть к куче не менее чем в 77 камней:
- после хода «+1» получается , нужно , то есть ;
- после хода «×2» получается , нужно , то есть .
Вместе с остаётся единственное значение .
Проверка: из кучи в 76 камней Петя получает 77 или 152 камней — до 153 не хватает ни в одном случае. Из 77 камней Ваня удваивает и получает 154 камней, из 152 камней Ваня добавляет один камень и получает 153 камней. И то и другое не меньше 153, значит Ваня выигрывает своим первым ходом при любом ходе Пети.
Тот же ответ даёт перебор:
N = 153
def moves(s):
return [s + 1, 2 * s]
def win1(s): # ходящий выигрывает первым же ходом
return any(t >= N for t in moves(s))
for s in range(1, N):
# сам выиграть не может, но любой его ход отдаёт победу сопернику
if not win1(s) and all(win1(t) for t in moves(s)):
print(s) # 76
Ответ: 76