21. Выигрышная стратегия: часть 3: все задания
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании 19, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Проверка игрового дерева даёт подходящие значения $S=41,\ 42,\ 44$. Минимальное из них: $S=41$.
Рассмотрим $S=41$. После первого хода Пети возможны позиции: $(15;41),\ (11;45),\ (33;41),\ (11;123)$.
Если получено $(33;41)$ или $(11;123)$, Ваня выигрывает сразу.
Из позиций $(15;41)$ и $(11;45)$ Ваня переводит игру в позицию $(15;45)$.
После любого хода Пети получим: $(19;45),\ (15;49),\ (45;45),\ (15;135)$.
- Из каждой позиции Ваня выигрывает одним ходом. Например:
- $19+45\cdot3=154$,
- $15+49\cdot3=162$,
- $45\cdot3+45=180$,
- $15+135+4=154$.
При этом после хода Пети $(11;41)\rightarrow(15;41)$ Ваня не может выиграть сразу. Значит, гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 4, b), (a, b + 4),
(a * 3, b), (a, b * 3)]
def win1(a, b):
return a + b < 154 and any(
x + y >= 154 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 154 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 154
)
for S in range(1, 143):
petya = moves(11, S)
if (all(a + b < 154 and win2(a, b)
for a, b in petya)
and not all(win1(a, b) for a, b in petya)):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантировать победу сразу после любого хода Пети.
Программа выведет: $41$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании 19, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Проверка игровых позиций показывает, что минимальное подходящее значение: $S=49$.
После первого хода Пети возможны позиции: $(17;49),\ (14;52),\ (42;49),\ (14;147)$.
Из позиций $(42;49)$ и $(14;147)$ Ваня выигрывает сразу.
Если Петя получает $(17;49)$ или $(14;52)$, Ваня своим ходом переводит игру в позицию $(17;52)$.
После любого хода Пети получим: $(20;52),\ (17;55),\ (51;52),\ (17;156)$.
Из каждой позиции Ваня выигрывает следующим ходом:
- $(20;52)\rightarrow(20;156)$, сумма $176$;
- $(17;55)\rightarrow(17;165)$, сумма $182$;
- $(51;52)\rightarrow(153;52)$, сумма $205$;
- $(17;156)\rightarrow(20;156)$, сумма $176$.
При этом после хода Пети $(14;49)\rightarrow(17;49)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Для $S<49$ Ваня не может гарантированно выиграть первым или вторым ходом при любой игре Пети.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 3, b), (a, b + 3),
(a * 3, b), (a, b * 3)]
def win1(a, b):
return a + b < 176 and any(
x + y >= 176 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 176 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 176
)
for S in range(1, 162):
petya = moves(14, S)
if (all(a + b < 176 and win2(a, b)
for a, b in petya)
and not all(win1(a, b) for a, b in petya)):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $49$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=32$.
У Пети есть два возможных хода.
Если Петя добавит один камень: $32\rightarrow33$.
Ваня получает $34$: $33\rightarrow34$.
После этого Петя может получить только $35$ или $68$, и Ваня выигрывает следующим ходом:
$35\rightarrow70$;
$68\rightarrow69$.
Если Петя удвоит кучу: $32\rightarrow64$, то Ваня выигрывает сразу: $64\rightarrow128$.
При этом после хода $32\rightarrow33$ Ваня не может выиграть своим первым ходом, поэтому гарантированной победы первым ходом у него нет.
Для $S<32$ условия одновременно не выполняются.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x * 2]
def win1(x):
return x < 69 and any(
y >= 69 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
all(
y < 69 and win1(y)
for y in moves(z)
)
for z in moves(x)
if z < 69
)
for S in range(1, 69):
if (
all(x < 69 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $32$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=44$.
После первого хода Пети возможны позиции:
$(21;44)$, $(17;48)$, $(34;44)$, $(17;88)$.
Если получена позиция $(17;88)$, Ваня выигрывает сразу: $(17;88)\rightarrow(17;176)$.
Из позиции $(21;44)$ Ваня получает $(42;44)$, из позиции $(17;48)$ — $(34;48)$, из позиции $(34;44)$ — $(34;48)$. После любого следующего хода Пети Ваня сможет выиграть своим вторым ходом.
Например, из $(42;44)$ Петя может получить: $(46;44)$, $(42;48)$, $(84;44)$, $(42;88)$, и из каждой такой позиции Ваня выигрывает следующим ходом.
При этом после хода Пети $(17;44)\rightarrow(21;44)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Для $S<44$ условия одновременно не выполняются.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 4, b), (a, b + 4),
(a * 2, b), (a, b * 2)]
def win1(a, b):
return a + b < 133 and any(
x + y >= 133 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 133 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 133
)
for S in range(1, 116):
petya = moves(17, S)
if (
all(a + b < 133 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $44$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=45$.
После первого хода Пети возможны позиции:
$(16;45)$, $(15;46)$, $(45;45)$, $(15;135)$.
Из позиций $(45;45)$ и $(15;135)$ Ваня выигрывает сразу.
Из $(16;45)$ Ваня получает: $(16;45)\rightarrow(16;46)$.
Из $(15;46)$ Ваня также получает: $(15;46)\rightarrow(16;46)$.
После этого Петя может получить: $(17;46)$, $(16;47)$, $(48;46)$, $(16;138)$.
Из каждой позиции Ваня выигрывает следующим ходом:
- $(17;46)\rightarrow(17;138)$, сумма $155$;
- $(16;47)\rightarrow(16;141)$, сумма $157$;
- $(48;46)\rightarrow(144;46)$, сумма $190$;
- $(16;138)\rightarrow(17;138)$, сумма $155$.
При этом после хода Пети $(15;45)\rightarrow(16;45)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 1, b), (a, b + 1),
(a * 3, b), (a, b * 3)]
def win1(a, b):
return a + b < 155 and any(
x + y >= 155 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 155 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 155
)
for S in range(1, 140):
petya = moves(15, S)
if (
all(a + b < 155 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $45$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=57$.
После первого хода Пети возможны позиции: $57\rightarrow54,\ 49,\ 19$.
Если Петя получает $49$ или $19$ камней, Ваня выигрывает сразу:
$49\rightarrow16$;
$19\rightarrow6$.
Если Петя получает $54$ камня, Ваня делает ход: $54\rightarrow51$.
После этого Петя может получить: $51\rightarrow48,\ 43,\ 17$.
Из каждой позиции Ваня выигрывает следующим ходом:
$48\rightarrow16$;
$43\rightarrow14$;
$17\rightarrow5$.
При этом после хода Пети $57\rightarrow54$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Для $S=51$, $52$, $53$ Ваня гарантированно выигрывает первым ходом, а при $S=54$, $55$, $56$ Петя может первым ходом оставить соответственно $51$, $52$, $53$ камня, что не позволяет Ване гарантированно выиграть первым или вторым ходом.
Минимальное значение: $57$.
Второй способ – решение с помощью Python
def moves(x):
return [x - 3, x - 8, x // 3]
def win1(x):
return x > 16 and any(
y <= 16 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
z > 16 and all(
y > 16 and win1(y)
for y in moves(z)
)
for z in moves(x)
)
for S in range(17, 1000):
if (
all(x > 16 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $57$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=60$.
После первого хода Пети возможны позиции: $60\rightarrow58,\ 56,\ 20$.
Если Петя оставил $20$ камней, Ваня выигрывает сразу: $20\rightarrow16$.
Если Петя оставил $58$ камней: $58\rightarrow54$.
Если Петя оставил $56$ камней: $56\rightarrow54$.
После позиции $54$ Петя может получить: $54\rightarrow52,\ 50,\ 18$.
Из каждой такой позиции Ваня выигрывает следующим ходом.
При этом после хода Пети $60\rightarrow58$ Ваня не может выиграть своим первым ходом, поэтому гарантированной победы первым ходом у него нет.
Для $S<60$ оба условия одновременно не выполняются.
Второй способ – решение с помощью Python
def moves(x):
return [x - 2, x - 4, x // 3]
def win1(x):
return x > 17 and any(
y <= 17 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
z > 17 and all(
y > 17 and win1(y)
for y in moves(z)
)
for z in moves(x)
)
for S in range(18, 1000):
if (
all(x > 17 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $60$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=70$.
После первого хода Пети возможны позиции: $70\rightarrow67,\ 63,\ 17$.
Из позиций $63$ и $17$ Ваня выигрывает сразу:
$63\rightarrow15$;
$17\rightarrow14$.
Если Петя получает $67$ камней, Ваня делает ход: $67\rightarrow64$.
После этого Петя может получить: $64\rightarrow61,\ 57,\ 16$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$61\rightarrow15$;
$57\rightarrow14$;
$16\rightarrow13$.
При этом после хода Пети $70\rightarrow67$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x - 3, x - 7, x // 4]
def win1(x):
return x > 15 and any(
y <= 15 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
z > 15 and all(
y > 15 and win1(y)
for y in moves(z)
)
for z in moves(x)
)
for S in range(16, 1000):
if (
all(x > 15 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $70$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=17$.
После первого хода Пети возможны позиции: $17\rightarrow18,\ 21,\ 51$.
Если Петя получил $51$ камень, Ваня выигрывает сразу: $51\rightarrow153$.
Если Петя получил $18$ камней, Ваня делает ход: $18\rightarrow22$.
Если Петя получил $21$ камень, Ваня также получает: $21\rightarrow22$.
После позиции $22$ Петя может получить: $22\rightarrow23,\ 26,\ 66$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$23\rightarrow69$;
$26\rightarrow78$;
$66\rightarrow67$.
При этом после хода Пети $17\rightarrow18$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x + 4, x * 3]
def win1(x):
return x < 67 and any(
y >= 67 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 67 and all(
z < 67 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 67):
if (
all(x < 67 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $17$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=102$.
После первого хода Пети возможны позиции: $102\rightarrow100,\ 98,\ 25$.
Если Петя оставил $25$ камней, Ваня выигрывает сразу: $25\rightarrow23$.
Если Петя оставил $100$ камней: $100\rightarrow96$.
Если Петя оставил $98$ камней: $98\rightarrow96$.
После позиции $96$ Петя может получить: $96\rightarrow94,\ 92,\ 24$.
Из каждой такой позиции Ваня выигрывает следующим ходом.
При этом после ходов Пети $102\rightarrow100$ и $102\rightarrow98$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x - 2, x - 4, x // 4]
def win1(x):
return x > 23 and any(
y <= 23 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y > 23 and all(
z > 23 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(24, 1000):
if (
all(x > 23 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $102$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=132$.
После первого хода Пети возможны позиции: $132\rightarrow129,\ 127,\ 33$.
Если Петя оставил $33$ камня, Ваня выигрывает сразу: $33\rightarrow30$.
Если Петя оставил $129$ камней, Ваня делает ход: $129\rightarrow126$.
После этого Петя может получить: $126\rightarrow123,\ 121,\ 31$, и из каждой такой позиции Ваня выигрывает следующим ходом.
Если Петя оставил $127$ камней: $127\rightarrow124$.
После этого Петя может получить: $124\rightarrow121,\ 119,\ 31$, и Ваня снова выигрывает следующим ходом.
При этом после хода Пети $132\rightarrow129$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
При $S=124,\ 125,\ 126$ Ваня гарантированно выигрывает первым ходом, а при $127\leq S\leq131$ Петя может оставить $124$, $125$ или $126$ камней, после чего Ваня не может гарантировать победу.
Второй способ – решение с помощью Python
def moves(x):
return [x - 3, x - 5, x // 4]
def win1(x):
return x > 30 and any(
y <= 30 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y > 30 and all(
z > 30 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(31, 1000):
if (
all(x > 30 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $132$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=30$.
После первого хода Пети возможны позиции:
$30\rightarrow31$;
$30\rightarrow60$.
Если Петя получил $60$ камней, Ваня выигрывает сразу: $60\rightarrow120$.
Если Петя получил $31$ камень, Ваня делает ход: $31\rightarrow32$.
После этого Петя может получить: $32\rightarrow33$ или $32\rightarrow64$.
Из обеих позиций Ваня выигрывает следующим ходом:
$33\rightarrow66$;
$64\rightarrow128$.
При этом после хода Пети $30\rightarrow31$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x * 2]
def win1(x):
return x < 66 and any(
y >= 66 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 66 and all(
z < 66 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 66):
if (
all(x < 66 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $30$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=23$.
После первого хода Пети возможны позиции: $23\rightarrow24,\ 27,\ 46$.
Если Петя получил $46$ камней, Ваня выигрывает сразу: $46\rightarrow92$.
Если Петя получил $24$ камня, Ваня делает ход: $24\rightarrow28$.
Если Петя получил $27$ камней, Ваня также получает: $27\rightarrow28$.
После позиции $28$ Петя может получить: $28\rightarrow29,\ 32,\ 56$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$29\rightarrow58$;
$32\rightarrow64$;
$56\rightarrow60$.
При этом после ходов Пети $23\rightarrow24$ и $23\rightarrow27$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x + 4, x * 2]
def win1(x):
return x < 58 and any(
y >= 58 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 58 and all(
z < 58 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 58):
if (
all(x < 58 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $23$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=32$.
После первого хода Пети возможны позиции: $(8;32)$, $(7;33)$, $(14;32)$, $(7;64)$.
Из позиции $(7;64)$ Ваня выигрывает сразу: $(7;64)\rightarrow(7;128)$.
Если Петя получил $(8;32)$, Ваня делает ход: $(8;32)\rightarrow(16;32)$.
После этого Петя может получить: $(17;32)$, $(16;33)$, $(32;32)$, $(16;64)$.
Из каждой такой позиции Ваня выигрывает следующим ходом.
Если Петя получил $(7;33)$ или $(14;32)$, Ваня переводит игру в позицию $(14;33)$, после которой также гарантированно выигрывает своим вторым ходом.
При этом после хода Пети $(7;32)\rightarrow(8;32)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 1, b), (a, b + 1),
(a * 2, b), (a, b * 2)]
def win1(a, b):
return a + b < 81 and any(
x + y >= 81 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 81 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 81
)
for S in range(1, 74):
petya = moves(7, S)
if (
all(a + b < 81 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $32$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=20$.
После первого хода Пети возможны позиции: $20\rightarrow21,\ 24,\ 40$.
Если Петя получил $40$ камней, Ваня выигрывает сразу: $40\rightarrow80$.
Если Петя получил $21$ камень, Ваня делает ход: $21\rightarrow25$.
Если Петя получил $24$ камня, Ваня также получает: $24\rightarrow25$.
После позиции $25$ Петя может получить: $25\rightarrow26,\ 29,\ 50$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$26\rightarrow52$;
$29\rightarrow58$;
$50\rightarrow51$.
При этом после ходов Пети $20\rightarrow21$ и $20\rightarrow24$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x + 4, x * 2]
def win1(x):
return x < 51 and any(
y >= 51 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 51 and all(
z < 51 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 51):
if (
all(x < 51 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $20$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=68$.
После первого хода Пети возможны позиции: $(16;68),\ (14;70),\ (28;68),\ (14;136)$.
Если Петя получил $(14;136)$, Ваня выигрывает сразу.
Из позиции $(16;68)$ Ваня получает: $(16;68)\rightarrow(32;68)$.
После этого Петя может получить: $(34;68),\ (32;70),\ (64;68),\ (32;136)$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
- $(34;68)\rightarrow(34;136)$, сумма $170$;
- $(32;70)\rightarrow(32;140)$, сумма $172$;
- $(64;68)\rightarrow(64;136)$, сумма $200$;
- $(32;136)\rightarrow(34;136)$, сумма $170$.
Из позиций $(14;70)$ и $(28;68)$ Ваня переводит игру в позицию $(28;70)$, после которой также гарантированно выигрывает своим вторым ходом.
При этом после хода Пети $(14;68)\rightarrow(16;68)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Ответ: $68$.
Второй способ – решение с помощью 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 < 169 and any(
x + y >= 169 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 169 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 169
)
for S in range(1, 155):
petya = moves(14, S)
if (
all(a + b < 169 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $68$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=16$.
После первого хода Пети возможны позиции:
$16\rightarrow17$;
$16\rightarrow32$.
Если Петя получил $32$ камня, Ваня выигрывает сразу: $32\rightarrow64$.
Если Петя получил $17$ камней, Ваня делает ход: $17\rightarrow18$.
После этого Петя может получить: $18\rightarrow19$ или $18\rightarrow36$.
Из обеих позиций Ваня выигрывает следующим ходом:
$19\rightarrow38$;
$36\rightarrow72$.
При этом после хода Пети $16\rightarrow17$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(x):
return [x + 1, x * 2]
def win1(x):
return x < 38 and any(
y >= 38 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y < 38 and all(
z < 38 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(1, 38):
if (
all(x < 38 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $16$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите наименьшее значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=50$.
После первого хода Пети возможны позиции: $(16;50),\ (13;53),\ (26;50),\ (13;100)$.
Из позиции $(13;100)$ Ваня выигрывает сразу.
Если Петя получил $(16;50)$, Ваня делает ход: $(16;50)\rightarrow(32;50)$.
После этого Петя может получить: $(35;50),\ (32;53),\ (64;50),\ (32;100)$.
Из каждой такой позиции Ваня выигрывает следующим ходом.
Если Петя получил $(13;53)$, Ваня получает: $(13;53)\rightarrow(26;53)$.
Если Петя получил $(26;50)$, Ваня также получает: $(26;50)\rightarrow(26;53)$.
После позиции $(26;53)$ Ваня гарантированно выигрывает своим вторым ходом.
При этом после хода Пети $(13;50)\rightarrow(16;50)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью 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 < 135 and any(
x + y >= 135 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 135 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 135
)
for S in range(1, 122):
petya = moves(13, S)
if (
all(a + b < 135 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $50$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений $S$, в ответе запишите наименьшее из них.
Первый способ – математическое решение
Минимальное подходящее значение: $S=18$.
После первого хода Пети возможны позиции: $(7;18),\ (6;19),\ (18;18),\ (6;54)$.
Из позиций $(18;18)$ и $(6;54)$ Ваня выигрывает сразу.
Если Петя получил $(7;18)$, Ваня делает ход: $(7;18)\rightarrow(7;19)$.
Если Петя получил $(6;19)$, Ваня также получает: $(6;19)\rightarrow(7;19)$.
После позиции $(7;19)$ Петя может получить: $(8;19),\ (7;20),\ (21;19),\ (7;57)$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
- $(8;19)\rightarrow(8;57)$, сумма $65$;
- $(7;20)\rightarrow(7;60)$, сумма $67$;
- $(21;19)\rightarrow(63;19)$, сумма $82$;
- $(7;57)\rightarrow(8;57)$, сумма $65$.
При этом после хода Пети $(6;18)\rightarrow(7;18)$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Второй способ – решение с помощью Python
def moves(a, b):
return [(a + 1, b), (a, b + 1),
(a * 3, b), (a, b * 3)]
def win1(a, b):
return a + b < 65 and any(
x + y >= 65 for x, y in moves(a, b)
)
def win2(a, b):
if win1(a, b):
return True
return any(
all(
x + y < 65 and win1(x, y)
for x, y in moves(c, d)
)
for c, d in moves(a, b)
if c + d < 65
)
for S in range(1, 59):
petya = moves(6, S)
if (
all(a + b < 65 and win2(a, b) for a, b in petya)
and not all(win1(a, b) for a, b in petya)
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $18$.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя.
Для игры, описанной в задании $19$, найдите минимальное значение $S$, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Первый способ – математическое решение
Минимальное подходящее значение: $S=52$.
После первого хода Пети возможны позиции: $52\rightarrow49,\ 47,\ 13$.
Если Петя оставил $13$ камней, Ваня выигрывает сразу: $13\rightarrow10$.
Если Петя оставил $49$ камней, Ваня делает ход: $49\rightarrow44$.
Если Петя оставил $47$ камней: $47\rightarrow44$.
После позиции $44$ Петя может получить: $44\rightarrow41,\ 39,\ 11$.
Из каждой такой позиции Ваня выигрывает следующим ходом:
$41\rightarrow10$;
$39\rightarrow9$;
$11\rightarrow8$.
При этом после ходов Пети $52\rightarrow49$ и $52\rightarrow47$ Ваня не может выиграть сразу, поэтому гарантированной победы первым ходом у него нет.
Для $S<52$ оба условия одновременно не выполняются.
Ответ: $52$.
Второй способ – решение с помощью Python
def moves(x):
return [x - 3, x - 5, x // 4]
def win1(x):
return x > 10 and any(
y <= 10 for y in moves(x)
)
def win2(x):
if win1(x):
return True
return any(
y > 10 and all(
z > 10 and win1(z)
for z in moves(y)
)
for y in moves(x)
)
for S in range(11, 1000):
if (
all(x > 10 and win2(x) for x in moves(S))
and not all(win1(x) for x in moves(S))
):
print(S)
break
Программа проверяет, что после любого хода Пети Ваня может выиграть первым или вторым ходом, но не может гарантированно выиграть своим первым ходом.
Программа выведет: $52$.