20. Выигрышная стратегия: часть 2: #295302
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Известно, что Ваня выиграл своим первым ходом после неудачного хода Пети.
Для игры, описанной в задании $19$, найдите два наименьших значения $S$, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
- Петя не может выиграть за один ход;
- Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без пробелов.
Первый способ – математическое решение
Петя не должен выигрывать первым ходом, поэтому:
$9+2S<129$,
$S\leq59$.
Первое подходящее значение: $S=54$. Петя удваивает первую кучу: $(9;54)\rightarrow(18;54)$.
Ваня может получить: $(21;54),\ (18;57),\ (36;54),\ (18;108)$.
Из каждой такой позиции Петя выигрывает следующим ходом:
- $(21;54)\rightarrow(21;108)$, сумма $129$;
- $(18;57)\rightarrow(18;114)$, сумма $132$;
- $(36;54)\rightarrow(36;108)$, сумма $144$;
- $(18;108)\rightarrow(21;108)$, сумма $129$.
При $S=55$ Петя действует так же: $(9;55)\rightarrow(18;55)$, и после любого хода Вани выигрывает следующим ходом.
Для $S<54$ гарантированной победы вторым ходом у Пети нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 3, b), (a, b + 3),
(a * 2, b), (a, b * 2)]
def win1(a, b):
return a + b < 129 and any(
x + y >= 129 for x, y in moves(a, b)
)
ans = []
for S in range(1, 120):
if not win1(9, S):
if any(
all(
x + y < 129 and win1(x, y)
for x, y in moves(a, b)
)
for a, b in moves(9, S)
):
ans.append(S)
print(ans[:2])
Программа проверяет, что Петя не может выиграть первым ходом, а затем ищет такой его ход, после которого при любом ходе Вани Петя выигрывает следующим ходом.
Программа выведет: $[54,\ 55]$.