Две кучи
Пройти тестирование по этим заданиям
Вернуться к каталогу заданий
Версия для печати и копирования в MS Word


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было семь камней, во второй куче —
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, то есть не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное
Заметим, что игра должна закончиться
Ответ: 18.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 77:
return 1
elif h == 3 and x + y < 77:
return 0
elif x + y >= 77 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(1, 70):
if f(x, 7, 1) == 1:
print("Задача 19:", x)
break
Приведём решение Артёма Гридина на языке Python.
from functools import lru_cache
def moves(h):
a, b = h
return (a+1, b), (a, b+1), (a*2, b), (b*2, a)
@lru_cache(None)
def game(h):
if sum(h) >= 77: return 'W'
if any(game(m) == 'W' for m in moves(h)): return 'P1'
if any(game(m) == 'P1' for m in moves(h)): return 'V1'
for s in range(1, 70):
if game((7, s)) == 'V1':
print(s)
break
Приведём решение Глеба Гришко на языке Python.
def f(a,b,m):
if a+b>=77:
return m%2==0
if m==0:
return 0
h = [f(a+1,b,m-1),f(a*2,b,m-1),f(a,b+1,m-1),f(a,b*2,m-1)]
return any(h) if (m-1)%2==0 else any(h)
print(min([s for s in range(1,70) if not f(7,s,1) and f(7,s,2)]))
Приведём решение Георгия Вострикова на языке Python.
def f(k1, k2, hod):
# hod - номер хода. 1 - первый ход Пети, 2 - первый ход Вани, 3 - второй ход Пети, 4 - второй ход Вани
if hod == who_win and k1 + k2 >= win_sum:
# нужный игрок победил на нужном ходе
return 1
elif hod == who_win and k1 + k2 < win_sum:
# нужный игрок не победил на нужном ходе
return 0
elif hod < who_win and k1 + k2 >= win_sum:
# Петя или Ваня победил раньше времени
if ZADANIE != 21:
return 0
elif hod == who_win-2:
# в №21 допускаем победу Вани первым ходом(раньше времени, когда hod == 3)
return 1
# дальше начинается сам ход игрока
# ПРИМЕР: если hod = 3, то выше мы проверили не победил ли Ваня после своего первого хода
# если ещё не победил, тогда уже делаем второй ход Пети
else:
# hod - чётный, значит, сейчас ходит Ваня, иначе(нечёт) Петя
if hod % 2 == 0:
# действия Вани с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 21:
# играем за Ваню, подойдёт любое удобное дейтсвие(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 20:
# играем против Вани, проверяем все его возможные действия(and)
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
else:
# действия Пети с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 20:
# играем против Пети или за Петю, подойдёт любое неудачное/удачное действие Пети(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 21:
# играем против Пети, проверяем все его возможные действия(and) для победы Вани 2ым ходом
if who_win == 5:
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
elif who_win == 3:
# играем против Пети: проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if ((f(k1, k2 + sum2, hod + 1) + f(k1 + sum1, k2, hod + 1) + f(k1, k2 * x2, hod + 1) + f(k1 * x1, k2, hod + 1)) < kol):
return 1
# УСЛОВИЯ ЗАДАЧИ ------------------------------------------------
sum1 = 1 # сколько можно прибавлять в 1ую кучу
sum2 = 1 # сколько можно прибавлять во 2ую кучу
x1 = 2 # во сколько раз можно умножать 1ую кучу
x2 = 2 # во сколько раз можно умножать 2ую кучу
kol = 4 # количество вариантов действий с кучами
k1 = 7 # количество камней в 1ой куче
win_sum = 77 # общая сумма камней от которой начинается победа
k2_max = 69 # максимальное S(количество камней во 2ой куче)
# НОМЕР ЗАДАЧИ --------------------------------------------------
ZADANIE = 19 # для какого задания программа (19, 20 или 21)
if ZADANIE == 19:
# who_win - кто должен выиграть и каким ходом?
who_win = 3 # №19 - Ваня первым ходом
elif ZADANIE == 20:
who_win = 4 # №20 - Петя вторым ходом
elif ZADANIE == 21:
who_win = 5 # №21 - Ваня вторым ходом
for k2 in range(1, k2_max):
if f(k1, k2, 1) == 1:
if ZADANIE == 21:
who_win = 3 # проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if f(k1, k2, 1) == 1:
print(k2)
break
else:
print(k2)
if ZADANIE != 20:
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было семь камней, во второй куче —
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными,
Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Из хода решения предыдущего задания можно заключить, что значения S
Второе значение S — 31. При S = 31 Петя удваивает количество камней в первой куче и получает позицию (14, 31). После первого хода Вани может возникнуть одна из четырёх позиций: (15, 31), (14, 32), (28, 31), (14, 62). Во всех случаях Петя удваивает количество камней во второй куче и выигрывает своим вторым ходом.
Таким образом, ответ —3134.
Ответ: 3134.
Приведём решение на языке Python.
def f(x, y, h):
if h == 4 and x + y >= 77:
return 1
elif h == 4 and x + y < 77:
return 0
elif x + y >= 77 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x * 2, y, h + 1) and f(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 70):
if f(x, 7, 1) == 1:
print("Задача 20:", x)
Приведём решение Виктории Зиберовой на языке Python.
def f (k1,k2, m):
if k1+k2 >= 77:
return m%2==0
if m==0:
return 0
h=[f(k1+1, k2, m-1),f(k1, k2+1, m-1), f(k1*2, k2, m-1), f(k1, k2*2, m-1)]
return any(h) if m%2 !=0 else all(h)
print('Задание 20:', (*[s for s in range (1, 70) if f(7,s,3) and not f(7, s, 1)]))
Приведём решение Георгия Вострикова на языке Python.
def f(k1, k2, hod):
# hod - номер хода. 1 - первый ход Пети, 2 - первый ход Вани, 3 - второй ход Пети, 4 - второй ход Вани
if hod == who_win and k1 + k2 >= win_sum:
# нужный игрок победил на нужном ходе
return 1
elif hod == who_win and k1 + k2 < win_sum:
# нужный игрок не победил на нужном ходе
return 0
elif hod < who_win and k1 + k2 >= win_sum:
# Петя или Ваня победил раньше времени
if ZADANIE != 21:
return 0
elif hod == who_win-2:
# в №21 допускаем победу Вани первым ходом(раньше времени, когда hod == 3)
return 1
# дальше начинается сам ход игрока
# ПРИМЕР: если hod = 3, то выше мы проверили не победил ли Ваня после своего первого хода
# если ещё не победил, тогда уже делаем второй ход Пети
else:
# hod - чётный, значит, сейчас ходит Ваня, иначе(нечёт) Петя
if hod % 2 == 0:
# действия Вани с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 21:
# играем за Ваню, подойдёт любое удобное дейтсвие(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 20:
# играем против Вани, проверяем все его возможные действия(and)
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
else:
# действия Пети с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 20:
# играем против Пети или за Петю, подойдёт любое неудачное/удачное действие Пети(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 21:
# играем против Пети, проверяем все его возможные действия(and) для победы Вани 2ым ходом
if who_win == 5:
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
elif who_win == 3:
# играем против Пети: проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if ((f(k1, k2 + sum2, hod + 1) + f(k1 + sum1, k2, hod + 1) + f(k1, k2 * x2, hod + 1) + f(k1 * x1, k2, hod + 1)) < kol):
return 1
# УСЛОВИЯ ЗАДАЧИ ------------------------------------------------
sum1 = 1 # сколько можно прибавлять в 1ую кучу
sum2 = 1 # сколько можно прибавлять во 2ую кучу
x1 = 2 # во сколько раз можно умножать 1ую кучу
x2 = 2 # во сколько раз можно умножать 2ую кучу
kol = 4 # количество вариантов действий с кучами
k1 = 7 # количество камней в 1ой куче
win_sum = 77 # общая сумма камней от которой начинается победа
k2_max = 69 # максимальное S(количество камней во 2ой куче)
# НОМЕР ЗАДАЧИ --------------------------------------------------
ZADANIE = 20 # для какого задания программа (19, 20 или 21)
if ZADANIE == 19:
# who_win - кто должен выиграть и каким ходом?
who_win = 3 # №19 - Ваня первым ходом
elif ZADANIE == 20:
who_win = 4 # №20 - Петя вторым ходом
elif ZADANIE == 21:
who_win = 5 # №21 - Ваня вторым ходом
for k2 in range(1, k2_max):
if f(k1, k2, 1) == 1:
if ZADANIE == 21:
who_win = 3 # проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if f(k1, k2, 1) == 1:
print(k2)
break
else:
print(k2)
if ZADANIE != 20:
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было семь камней, во второй куче —
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, то есть не являющиеся выигрышными независимо от игры противника.
Найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Такое значение S — 30. При S = 30 Петя своим первым ходом может получить одну из четырёх позиций: (7, 31), (8, 30), (14, 30), (7, 60).
В позиции (7, 60) Ваня удваивает количество камней во второй куче и выигрывает своим первым ходом.
Из позиций (14, 30) и (7, 31) Ваня может получить позицию (14, 31). В этом случае после второго хода Пети может возникнуть одна из четырёх позиций: (15, 31), (14, 32), (28, 31), (14, 62). Во всех случаях Ваня удваивает количество камней во второй куче и выигрывает своим вторым ходом.
Из позиции (8, 30) Ваня своим первым ходом может получить позицию (16, 30). После второго хода Пети может возникнуть одна из четырёх позиций: (17, 30), (16, 31), (32, 30), (16, 60). Во всех случаях Ваня удваивает количество камней во второй куче и выигрывает своим вторым ходом.
Таким образом, ответ — 30.
Ответ: 30.
Примечание. Докажем, что при S ≤ 29 либо выигрывает Петя своим первым или вторым ходом, либо игра не завершится
При S ≤ 7 Петя своим первым ходом может добавить в большую кучу один камень. Тогда, даже если изначально S = 7, наибольшее количество камней, которое можно получить суммарно в обеих кучах
При 8 ≤ S ≤ 16 Петя может выбрать такую стратегию, которая не позволит победить Ване за один или два хода. Для этого Петя каждый ход может прибавлять к первой куче один камень. При этом наибольшее суммарное количество камней в обеих кучах, которое можно получить
При S = 17. Петя первым ходом может получить позицию (7, 18). Из этой позиции Ваня может получит позиции (8, 18), (7, 19), (14, 18) и (7, 36). В позиции (7, 36) Петя выигрывает своим вторым ходом. В остальных позициях у Пети есть стратегия, которая позволяет ему получить позиции, из которых Ваня не сможет выиграть своим вторым ходом.
При 18 ≤ S ≤ 29 Петя может получить позицию (8, S). В этой позиции Петя либо выигрывает своим вторым ходом, либо у него есть стратегия, которая позволяет ему получить позиции, в которых Ваня не может выиграть своим первым или вторым ходом.
Приведём решение на языке Python.
Исключим стратегию Вани, при которой он гарантировано выиграет первым ходом:
def f(x, y, h):
if (h == 3 or h == 5) and x + y >= 77:
return 1
elif h == 5 and x + y < 77:
return 0
elif x + y >= 77 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x * 2, y, h + 1) and f(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
def f1(x, y, h):
if h == 3 and x + y >= 77:
return 1
elif h == 3 and x + y < 77:
return 0
elif x + y >= 77 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x + 1, y, h + 1) or f1(x, y + 1, h + 1) or f1(x * 2, y, h + 1) or f1(x, y * 2, h + 1) # стратегия победителя
else:
return f1(x + 1, y, h + 1) and f1(x, y + 1, h + 1) and f1(x * 2, y, h + 1) and f1(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 70):
if f(x, 7, 1) == 1:
print(x)
print("====")
for x in range(1, 70):
if f1(x, 7, 1) == 1:
print(x)
Приведём решение Михаила Глинского на языке Python.
def f(x,y,n):
if n%2==0 and (x+y)>=77: return 1
if n==4 and (x+y)<77: return 0
if n%2==1 and (x+y)>=77: return 0
else:
if n%2==0: return f(x+1,y,n+1) and f(x*2,y,n+1) and f(x,y+1,n+1) and f(x,y*2,n+1)
if n%2==1: return f(x+1,y,n+1) or f(x*2,y,n+1) or f(x,y+1,n+1) or f(x,y*2,n+1)
for s in range(1,70):
if f(7,s,0):
print(s)
break
Приведём решение Георгия Вострикова на языке Python.
def f(k1, k2, hod):
# hod - номер хода. 1 - первый ход Пети, 2 - первый ход Вани, 3 - второй ход Пети, 4 - второй ход Вани
if hod == who_win and k1 + k2 >= win_sum:
# нужный игрок победил на нужном ходе
return 1
elif hod == who_win and k1 + k2 < win_sum:
# нужный игрок не победил на нужном ходе
return 0
elif hod < who_win and k1 + k2 >= win_sum:
# Петя или Ваня победил раньше времени
if ZADANIE != 21:
return 0
elif hod == who_win-2:
# в №21 допускаем победу Вани первым ходом(раньше времени, когда hod == 3)
return 1
# дальше начинается сам ход игрока
# ПРИМЕР: если hod = 3, то выше мы проверили не победил ли Ваня после своего первого хода
# если ещё не победил, тогда уже делаем второй ход Пети
else:
# hod - чётный, значит, сейчас ходит Ваня, иначе(нечёт) Петя
if hod % 2 == 0:
# действия Вани с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 21:
# играем за Ваню, подойдёт любое удобное дейтсвие(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 20:
# играем против Вани, проверяем все его возможные действия(and)
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
else:
# действия Пети с кучами (по условию: k1/k2 + 1 и k1/k2 * 2)
if ZADANIE == 19 or ZADANIE == 20:
# играем против Пети или за Петю, подойдёт любое неудачное/удачное действие Пети(or)
return f(k1, k2 + sum2, hod + 1) or f(k1 + sum1, k2, hod + 1) or f(k1, k2 * x2, hod + 1) or f(k1 * x1, k2, hod + 1)
elif ZADANIE == 21:
# играем против Пети, проверяем все его возможные действия(and) для победы Вани 2ым ходом
if who_win == 5:
return f(k1, k2 + sum2, hod + 1) and f(k1 + sum1, k2, hod + 1) and f(k1, k2 * x2, hod + 1) and f(k1 * x1, k2, hod + 1)
elif who_win == 3:
# играем против Пети: проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if ((f(k1, k2 + sum2, hod + 1) + f(k1 + sum1, k2, hod + 1) + f(k1, k2 * x2, hod + 1) + f(k1 * x1, k2, hod + 1)) < kol):
return 1
# УСЛОВИЯ ЗАДАЧИ ------------------------------------------------
sum1 = 1 # сколько можно прибавлять в 1ую кучу
sum2 = 1 # сколько можно прибавлять во 2ую кучу
x1 = 2 # во сколько раз можно умножать 1ую кучу
x2 = 2 # во сколько раз можно умножать 2ую кучу
kol = 4 # количество вариантов действий с кучами
k1 = 7 # количество камней в 1ой куче
win_sum = 77 # общая сумма камней от которой начинается победа
k2_max = 69 # максимальное S(количество камней во 2ой куче)
# НОМЕР ЗАДАЧИ --------------------------------------------------
ZADANIE = 21 # для какого задания программа (19, 20 или 21)
if ZADANIE == 19:
# who_win - кто должен выиграть и каким ходом?
who_win = 3 # №19 - Ваня первым ходом
elif ZADANIE == 20:
who_win = 4 # №20 - Петя вторым ходом
elif ZADANIE == 21:
who_win = 5 # №21 - Ваня вторым ходом
for k2 in range(1, k2_max):
if f(k1, k2, 1) == 1:
if ZADANIE == 21:
who_win = 3 # проверяем, что не при любых ходах Пети, Ваня может выиграть первым ходом
if f(k1, k2, 1) == 1:
print(k2)
break
else:
print(k2)
if ZADANIE != 20:
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в четыре раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное
Заметим, что игра должна закончиться
Ответ: 5.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 82:
return 1
elif h == 3 and x + y < 82:
return 0
elif x + y >= 82 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 4, y, h + 1) or f(x, y * 4, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 4, y, h + 1) or f(x, y * 4, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(1, 78):
if f(x, 4, 1) == 1:
print("Задача 19:", x)
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в четыре раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Возможные значения S: 16, 19. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако при S = 16 Петя может получить
В первом случае после хода Вани возникнет одна из позиций (17, 16), (64, 16), (16, 17), (16, 64), во втором случае — одна из позиций (6, 19), (20, 19), (5, 20), (5, 76). В любой из перечисленных позиций Петя может выиграть, умножив количество камней во большей куче.
Таким образом, ответ — 1619.
Ответ: 1619.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 4 and x + y >= 82:
return 1
elif h == 4 and x + y < 82:
return 0
elif x + y >= 82 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 4, y, h + 1) or f(x, y * 4, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x * 4, y, h + 1) and f(x, y * 4, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 78):
if f(x, 4, 1) == 1:
print("Задача 20:", x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в четыре раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Минимальное значение S: 18. После первого хода Пети возможны позиции (5, 18), (16, 18), (4, 19), (4, 72). В позициях (16, 18) и (4, 72) Ваня может выиграть первым ходом, умножив количество камней в любой куче. Из позиций (5, 18) и (4, 19) Ваня может получить
Таким образом, ответ — 18.
Ответ: 18.
Приведём другое решение на языке Python.
Исключим стратегию Вани, при которой он гарантировано выиграет первым ходом:
def f(x, y, h):
if (h == 3 or h == 5) and x + y >= 82:
return 1
elif h == 5 and x + y < 82:
return 0
elif x + y >= 82 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x * 4, y, h + 1) or f(x, y * 4, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x * 4, y, h + 1) and f(x, y * 4, h + 1) # стратегия проигравшего(любой ход)
def f1(x, y, h):
if h == 3 and x + y >= 82:
return 1
elif h == 3 and x + y < 82:
return 0
elif x + y >= 82 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x + 1, y, h + 1) or f1(x, y + 1, h + 1) or f1(x * 4, y, h + 1) or f1(x, y * 4, h + 1) # стратегия победителя
else:
return f1(x + 1, y, h + 1) and f1(x, y + 1, h + 1) and f1(x * 4, y, h + 1) and f1(x, y * 4, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 78):
if f(x, 4, 1) == 1:
print(x)
print("====")
for x in range(1, 78):
if f1(x, 4, 1) == 1:
print(x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить один камень в одну из куч и два камня в другую или же увеличить количество камней в любой куче в два раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное
Такая ситуация возможна при S = 9. Если Петя удвоит первую кучу, получится
Ответ: 9.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 41:
return 1
elif h == 3 and x + y < 41:
return 0
elif x + y >= 41 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, y + 2, h + 1) or f(x + 2, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y + 2, h + 1) or f(x + 2, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(1, 33):
if f(x, 8, 1) == 1:
print("Задача 19:", x)
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить один камень в одну из куч и два камня в другую или же увеличить количество камней в любой куче в два раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Найдите максимальное S, при котором у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Петя не может выиграть первым ходом, но может выиграть вторым ходом при S = 14. Для победы Пете нужно добавить два камня в первую кучу и один во вторую, то есть сделать ход (10, 15). После хода Вани возникнет одна из позиций (11, 17), (12, 16), (20, 15), (10, 30). В любой из перечисленных позиций Петя может выиграть, удвоив количество камней во второй куче.
Таким образом, ответ — 14.
Ответ: 14.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 4 and x + y >= 41:
return 1
elif h == 4 and x + y < 41:
return 0
elif x + y >= 41 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x + 1, y + 2, h + 1) or f(x + 2, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y + 2, h + 1) and f(x + 2, y + 1, h + 1) and f(x * 2, y, h + 1) and f(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 33):
if f(x, 8, 1) == 1:
print("Задача 20:", x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить один камень в одну из куч и два камня в другую или же увеличить количество камней в любой куче в два раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Такое значение S — 10. После первого хода Пети возможны позиции (9, 12), (10, 11), (16, 10), (8, 20). В позициях (16, 10) и (8, 20) Ваня может выиграть первым ходом, удвоив количество камней в большей куче. Из позиций (10, 11) и (9, 12) Ваня может получить
Таким образом, ответ — 10.
Ответ: 10.
Приведём другое решение на языке Python.
Исключим стратегию Вани, при которой он гарантировано выиграет первым ходом:
def f(x, y, h):
if (h == 3 or h == 5) and x + y >= 41:
return 1
elif h == 5 and x + y < 41:
return 0
elif x + y >= 41 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x + 1, y + 2, h + 1) or f(x + 2, y + 1, h + 1) or f(x * 2, y, h + 1) or f(x, y * 2, h + 1) # стратегия победителя
else:
return f(x + 1, y + 2, h + 1) and f(x + 2, y + 1, h + 1) and f(x * 2, y, h + 1) and f(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
def f1(x, y, h):
if h == 3 and x + y >= 41:
return 1
elif h == 3 and x + y < 41:
return 0
elif x + y >= 41 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x + 1, y + 2, h + 1) or f1(x + 2, y + 1, h + 1) or f1(x * 2, y, h + 1) or f1(x, y * 2, h + 1) # стратегия победителя
else:
return f1(x + 1, y + 2, h + 1) and f1(x + 2, y + 1, h + 1) and f1(x * 2, y, h + 1) and f1(x, y * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 33):
if f(x, 8, 1) == 1:
print(x)
print("====")
for x in range(1, 33):
if f1(x, 8, 1) == 1:
print(x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень, увеличить количество камней в первой куче в два раза или увеличить количество камней во второй куче в три раза. Например, пусть в одной куче 6 камней, а в другой
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантирующие выигрыш независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное
Такая ситуация возможна при S = 7. Если Петя утроит вторую кучу, получится
Ответ: 7.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 69:
return 1
elif h == 3 and x + y < 69:
return 0
elif x + y >= 69 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x, y * 2, h + 1) or f(x * 3, y, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x, y * 2, h + 1) or f(x * 3, y, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(1, 59):
if f(x, 10, 1) == 1:
print("Задача 19:", x)
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень, увеличить количество камней в первой куче в два раза или увеличить количество камней во второй куче в три раза. Например, пусть в одной куче
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными,
Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Возможные значения S: 16, 19. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако при S = 16 Петя может получить
В первом случае после хода Вани возникнет одна из позиций (21, 16), (40, 16), (20, 17), (20, 48), во втором случае — одна из позиций (12, 19), (22, 19), (11, 20), (11, 57). В любой из перечисленных позиций Петя может выиграть, утроив количество камней во второй куче.
Таким образом, ответ — 1619.
Ответ: 1619.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 4 and x + y >= 69:
return 1
elif h == 4 and x + y < 69:
return 0
elif x + y >= 69 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x, y * 2, h + 1) or f(x * 3, y, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x, y * 2, h + 1) and f(x * 3, y, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 59):
if f(x, 10, 1) == 1:
print("Задача 20:", x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень, увеличить количество камней в первой куче в два раза или увеличить количество камней во второй куче в три раза. Например, пусть в одной куче
ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантирующие выигрыш независимо от игры противника.
Найдите минимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Возможное значение S: 18. После первого хода Пети возможны позиции (11, 18), (20, 18), (10, 19), (10, 54). В позициях (20, 18) и (10, 54) Ваня может выиграть первым ходом, утроив количество камней во второй куче. Из позиций (11, 18) и (10, 19) Ваня может получить позицию (11, 19), в этом случае после хода Пети возникает одна из позиций (12, 19), (22, 19), (11, 20), (11, 57). В любой из перечисленных позиций Ваня может выиграть, утроив количество камней во второй куче.
Таким образом, ответ — 18.
Ответ: 18.
Приведём другое решение на языке Python.
Исключим стратегию Вани, при которой он гарантировано выиграет первым ходом:
def f(x, y, h):
if (h == 3 or h == 5) and x + y >= 69:
return 1
elif h == 5 and x + y < 69:
return 0
elif x + y >= 69 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x + 1, y, h + 1) or f(x, y + 1, h + 1) or f(x, y * 2, h + 1) or f(x * 3, y, h + 1) # стратегия победителя
else:
return f(x + 1, y, h + 1) and f(x, y + 1, h + 1) and f(x, y * 2, h + 1) and f(x * 3, y, h + 1) # стратегия проигравшего(любой ход)
def f1(x, y, h):
if h == 3 and x + y >= 69:
return 1
elif h == 3 and x + y < 69:
return 0
elif x + y >= 69 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x + 1, y, h + 1) or f1(x, y + 1, h + 1) or f1(x, y * 2, h + 1) or f1(x * 3, y, h + 1) # стратегия победителя
else:
return f1(x + 1, y, h + 1) and f1(x, y + 1, h + 1) and f1(x, y * 2, h + 1) and f1(x * 3, y, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 59):
if f(x, 10, 1) == 1:
print(x)
print("====")
for x in range(1, 59):
if f1(x, 10, 1) == 1:
print(x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень меньше, чем убирается). Например, пусть в одной куче 6, а в другой 9 камней; такую позицию мы будем
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантирующие выигрыш независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация возможна.
Такая ситуация возможна при S = 43. Если Петя уменьшит количество камней во второй куче в два раза, получится
Ответ: 43.
Примечание.
Рекомендуем сравнить эту задачу с задачей 27774.
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y <= 20:
return 1
elif h == 3 and x + y > 20:
return 0
elif x + y <= 20 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x - 1, y, h + 1) or f(x, y - 1, h + 1) or f(x // 2, y, h + 1) or f(x, y // 2, h + 1) # стратегия победителя
else:
return f(x - 1, y, h + 1) or f(x, y - 1, h + 1) or f(x // 2, y, h + 1) or f(x, y // 2, h + 1) # стратегия проигравшего(неудачный ход)
for x in range(100, 10, -1):
if f(x, 10, 1) == 1:
print("Задача 19:", x)
break


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными,
Найдите пять таких значений S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания без разделительных знаков.
Возможные значения S: 23, 32, 24, 44, 45. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако при S = 32 Петя может получить
В первом случае после хода Вани возникнет одна из позиций (4, 32), (2, 32), (5, 31), (5, 16), во втором случае — одна из позиций (8, 24), (4, 24), (9, 23), (9, 12), в третьем случае — одна из позиций (5, 22), (9, 22), (10, 21), (10, 11). В любой из перечисленных позиций Петя может выиграть, уменьшив вдвое количество камней в большей куче.
Таким образом, ответ — 2324324445.
Ответ: 2324324445.
Приведём решение на языке Python.
def f(x, y, h):
if h == 4 and x + y <= 20:
return 1
elif h == 4 and x + y > 20:
return 0
elif x + y <= 20 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x - 1, y, h + 1) or f(x, y - 1, h + 1) or f(x // 2, y, h + 1) or f(x, y // 2, h + 1) # стратегия победителя
else:
return f(x - 1, y, h + 1) and f(x, y - 1, h + 1) and f(x // 2, y, h + 1) and f(x, y // 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(10, 1000):
if f(x, 10, 1) == 1:
print("Задача 20:", x)
Приведём решение Юрия Лысакова на языке Python.
def game(x,y,h):
if h == 3 and x + y <= 20:
return 1
if h == 3 and x + y > 20:
return 0
if h < 3 and x + y <= 20:
return 0
steps = [game(x - 1, y, h + 1), game(x, y - 1, h + 1), game(x // 2, y, h + 1), game(x, y // 2, h + 1)] #возможные ходы
if h % 2 == 0:
return any(steps) #Стратегия победителя
else:
return all(steps) #Стратегия проигравшего, в случае игры в «поддавки» ставим any вместо all
for x in range(10,1000):
if game(x, 10, 0) == 1:
print(x)


Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся
Игра завершается в тот момент, когда суммарное количество камней в кучах становится
В начальный момент в первой куче было
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантирующие выигрыш независимо от игры противника.
Найдите максимальное значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Такое значение S: 25. После первого хода Пети возможны позиции (9, 25), (5, 25), (10, 24), (10, 12). В позициях (5, 25) и (10, 12) Ваня может выиграть первым ходом, уменьшив вдвое количество камней во второй куче. Из позиций (9, 25) и (10, 24) Ваня может получить позицию (9, 24), в этом случае после хода Пети возникнет одна из позиций (8, 24), (4, 24), (9, 23), (9, 12). В любой из перечисленных позиций Ваня может выиграть, уменьшив вдвое количество камней в большей куче.
Таким образом, ответ — 25.
Ответ: 25.
Приведём решение на языке Python.
Исключим стратегию Вани, при которой он гарантировано выиграет первым ходом:
def f(x, y, h):
if (h == 3 or h == 5) and x + y <= 20:
return 1
elif h == 5 and x + y > 20:
return 0
elif x + y <= 20 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x - 1, y, h + 1) or f(x, y - 1, h + 1) or f(x // 2, y, h + 1) or f(x, y // 2, h + 1) # стратегия победителя
else:
return f(x - 1, y, h + 1) and f(x, y - 1, h + 1) and f(x // 2, y, h + 1) and f(x, y // 2, h + 1) # стратегия проигравшего(любой ход)
def f1(x, y, h):
if h == 3 and x + y <= 20:
return 1
elif h == 3 and x + y > 20:
return 0
elif x + y <= 20 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x - 1, y, h + 1) or f1(x, y - 1, h + 1) or f1(x // 2, y, h + 1) or f1(x, y // 2, h + 1) # стратегия победителя
else:
return f1(x - 1, y, h + 1) and f1(x, y - 1, h + 1) and f1(x // 2, y, h + 1) and f1(x, y // 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(10, 100):
if f(x, 10, 1) == 1:
print(x)
print("====")
for x in range(1, 100):
if f1(x, 10, 1) == 1:
print(x)
Приведём решение Юрия Лысакова на языке Python.
def game(x, y, h, h2):
if h > h2:
return 0
if x + y <= 20:
if h == 4 or h == 2:
return 1
else:
return 0
if h % 2 == 1:
return game(x - 1, y, h + 1, h2) or game(x, y - 1, h + 1, h2) or game(x // 2, y, h + 1, h2) or game(x, y // 2, h + 1, h2) #Стратегия победителя
else:
return game(x - 1, y, h + 1, h2) and game(x, y - 1, h + 1, h2) and game(x // 2, y, h + 1, h2) and game(x, y // 2, h + 1, h2) #Стратегия проигравшего, в случае игры в «поддавки» ставим or вместо and
for x in range(11,1000):
if game(x, 10, 0, 4) == 1 and game(x, 10, 0, 2) == 0: # вторая часть условия - требование задачи, о невозможности форсированного выигрыша Вани при его первом ходе
print(x)
Пройти тестирование по этим заданиям
Наверх