1905.py

print([ b for b in range(1, 110) if any( a1 + b1 < 123 and g(a1, b1, 1, [2]) for a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b))) and any(a1 + b1 < 123 and not g(a1, b1, 1, [2]) for a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b))) ])
def g(a, b, hod, end):
    if a + b >= 123:
        return hod in end
    if hod >= max(end):
        return False
    moves = [
        g(a + 1, b, hod + 1, end),
        g(a, b + 1, hod + 1, end),
        g(a * 2, b, hod + 1, end),
        g(a, b * 2, hod + 1, end),
    ]
    return any(moves) if ((hod + 1) % 2) == (end[0] % 2) else all(moves)

"""
print([
    b for b in range(1, 110)
    if any(
        a1 + b1 < 123 and 
        g(a1, b1, 1, [2]) for 
        a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b))) and 
        any(a1 + b1 < 123 and not 
        g(a1, b1, 1, [2]) for 
        a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b)))
])
"""
#"""
print([
    b for b in range(1, 110)
    if g(13, b, 0, end=[2])
    #if g(13, b, 0, [3]) and not g(13, b, 0, [1])
    #if g(13, b, 0, [2, 4]) and not g(13, b, 0, [2])
])
#"""

"""
Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежит две кучи камней.
Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может:

    добавить в одну из куч камень
    увеличить количество камней в одной из куч в 2 раза

Игра завершается,
когда суммарное количество камней в двух кучах
становится не менее 123.

Победителем считается игрок, сделавший последний ход,
то есть первым получивший суммарное количество
камней в двух кучах не менее 123.

В начальный момент в первой куче было 13 камней,
во второй - S камней, 1 ≤ S ≤ 109.

Будем говорить, что игрок имеет выигрышную стратегию,
если он может выиграть при любых ходах противника.

Задание 19:
    Укажите минимальное значение S, при котором
    Ваня выиграет своим первым ходом после неудачного хода Пети.

Задание 20:
    Найдите два минимальных значения S,
    при которых у Пети есть выигрышная стратегия,
    причём одновременно выполняются два условия:
    - Петя не может выиграть за один ход
    - Петя может выиграть своим вторым ходом
    независимо от того, как будет ходить Ваня
Найденные значения запишите в ответе в порядке возрастания.

Задание 21:
    Найдите минимальное значение S,
    при котором одновременно выполняются два условия:
    - у Вани есть выигрышная стратегия, позволяющая ему
    выиграть первым или вторым ходом при любой игре Пети
    - у Вани нет стратегии, которая позволит ему
    гарантированно выиграть первым ходом
Если найдено несколько значений S, в ответе запишите наименьшее из них.

"""
def g(a, b, hod, end):
    if a + b >= 123:
        return hod in end
    if hod >= max(end):
        return False
    moves = [
        g(a + 1, b, hod + 1, end),
        g(a, b + 1, hod + 1, end),
        g(a * 2, b, hod + 1, end),
        g(a, b * 2, hod + 1, end),
    ]
    return any(moves) if ((hod + 1) % 2) == (end[0] % 2) else all(moves)

"""
print([
    b for b in range(1, 110)
    if any(
        a1 + b1 < 123 and 
        g(a1, b1, 1, [2]) for 
        a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b))) and 
        any(a1 + b1 < 123 and not 
        g(a1, b1, 1, [2]) for 
        a1, b1 in ((14, b), (13, b + 1), (26, b), (13, 2 * b)))
])
"""
#"""
print([
    b for b in range(1, 110)
    if g(13, b, 0, end=[2])
    #if g(13, b, 0, [3]) and not g(13, b, 0, [1])
    #if g(13, b, 0, [2, 4]) and not g(13, b, 0, [2])
])
#"""

"""
Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежит две кучи камней.
Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может:

    добавить в одну из куч камень
    увеличить количество камней в одной из куч в 2 раза

Игра завершается,
когда суммарное количество камней в двух кучах
становится не менее 123.

Победителем считается игрок, сделавший последний ход,
то есть первым получивший суммарное количество
камней в двух кучах не менее 123.

В начальный момент в первой куче было 13 камней,
во второй - S камней, 1 ≤ S ≤ 109.

Будем говорить, что игрок имеет выигрышную стратегию,
если он может выиграть при любых ходах противника.

Задание 19:
    Укажите минимальное значение S, при котором
    Ваня выиграет своим первым ходом после неудачного хода Пети.

Задание 20:
    Найдите два минимальных значения S,
    при которых у Пети есть выигрышная стратегия,
    причём одновременно выполняются два условия:
    - Петя не может выиграть за один ход
    - Петя может выиграть своим вторым ходом
    независимо от того, как будет ходить Ваня
Найденные значения запишите в ответе в порядке возрастания.

Задание 21:
    Найдите минимальное значение S,
    при котором одновременно выполняются два условия:
    - у Вани есть выигрышная стратегия, позволяющая ему
    выиграть первым или вторым ходом при любой игре Пети
    - у Вани нет стратегии, которая позволит ему
    гарантированно выиграть первым ходом
Если найдено несколько значений S, в ответе запишите наименьшее из них.

"""

Репозиторий на GitHub