20. Выигрышная стратегия: часть 2: #295298
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети.
Для игры, описанной в задании $19$, найдите два наименьших значения $S$, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
- Петя не может выиграть за один ход;
- Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без пробелов.
Первый способ – математическое решение
Петя не должен выигрывать первым ходом, поэтому:
$7+2S<101$,
$S\leq46$.
Первое подходящее значение: $S=23$. Петя удваивает вторую кучу: $(7;23)\rightarrow(7;46)$.
Ваня может получить: $(9;46),\ (7;48),\ (14;46),\ (7;92)$.
Из каждой такой позиции Петя выигрывает следующим ходом:
- $(9;46)\rightarrow(9;92)$, сумма $101$;
- $(7;48)\rightarrow(7;96)$, сумма $103$;
- $(14;46)\rightarrow(14;92)$, сумма $106$;
- $(7;92)\rightarrow(9;92)$, сумма $101$.
Второе подходящее значение: $S=43$. Петя удваивает первую кучу: $(7;43)\rightarrow(14;43)$.
Ваня может получить: $(16;43),\ (14;45),\ (28;43),\ (14;86)$.
Из каждой такой позиции Петя также выигрывает следующим ходом.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 2, b), (a, b + 2),
(a * 2, b), (a, b * 2)]
def win1(a, b):
return a + b < 101 and any(
x + y >= 101 for x, y in moves(a, b)
)
ans = []
for S in range(1, 94):
if not win1(7, S):
if any(
all(
x + y < 101 and win1(x, y)
for x, y in moves(a, b)
)
for a, b in moves(7, S)
):
ans.append(S)
print(ans[:2])
Программа проверяет, что Петя не может выиграть первым ходом, а затем ищет такой его ход, после которого при любом ходе Вани Петя выигрывает следующим ходом.
Программа выведет: $[23,\ 43]$.