Текстовые решения некоторых заданий

Сайт: Не ждем, а готовимся!
Курс: Информатика ЕГЭ 2025
Книга: Текстовые решения некоторых заданий
Напечатано:: Гость
Дата: Воскресенье, 20 сентября 2026, 19:01

1. Демоверсия 2023

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

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

В начальный момент в куче было S камней, 1 ≤ S ≤ 128.

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

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

1.1. Аналитическое решение

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

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

В начальный момент в куче было S камней, 1 ≤ S ≤ 128.

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

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

Если изначально было S камней, то первым ходом Петя мог сделать S+1, либо 2*S. Далее, допустим, что Ваня сделал x, либо y, тогда дальнейшее развитие игры представлено ниже.


Рассмотрим ветку с X. Ваня мог победить первым ходом, т.е. X≥129, либо должен выполниться следующий ряд условий x+1<129; 2x<129; 2(x+1)≥129; 4x≥129.

Аналогичная ситуация будет с Y. Т.к. X это то, что получилось после хода Вани в ответ на ход Пети +1, то x=S+2, либо X=2S+2.



Y же это то, что получилось после хода Вани, в ответ на ход Пети *2, следовательно Y=2S+1, либо Y=4S.

Т.к. выиграть нужно и с X, и с Y, то необходимо найти решения для следующей системы.

И последний момент, который необходимо учесть - это то, что Ваня не может гарантированно победить своим первым ходом. Т.е. числа, которые мы найдем при решении следующей системы, необходимо выбросить.

Т.о. образом нам подходит только число 62.

Ответ: 62.

1.2. Программное решение

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

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

В начальный момент в куче было S камней, 1 ≤ S ≤ 128.

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

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

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

#Функция принимает 2 значения
#x - кол-во камней на текущей момент
#n - кол-во прошедших ходов
def f3(x,n):
    #Если еще никто не ходил
    if(n==0):
        #Ходит Петя
        #1й вариант добавить 1 камень
        v1=f3(x+1,n+1)
        #2й вариант увеличить количество камней в 2 раза
        v2=f3(x*2,n+1)
        #Если и v1, и v2 приводит Ваню к победе
        #то это удовлетворительный для нас результат
        return v1 and v2
    #Если только что сходил Петя
    elif(n==1):
        #Если он выиграл
        if(x>=129):
            #это неудовлетворительный результат
            return False
        #Если он не выиграл
        else:
            #то у Вани те же 2 варианта как сходить
            #1й вариант добавить 1 камень
            v1=f3(x+1,n+1)
            #2й вариант увеличить количество камней в 2 раза
            v2=f3(x*2,n+1)
            #Если v1 или v2 приводит Ваню к победе
            #то это удовлетворительный для нас результат
            return v1 or v2
    #Если только что сходил Ваня
    elif(n==2):
        #Если он выиграл
        if(x>=129):
            #это удовлетворительный результат
            return True
        #Если он не выиграл
        else:
            #то у Пети те же 2 варианта как сходить
            #1й вариант добавить 1 камень
            v1=f3(x+1,n+1)
            #2й вариант увеличить количество камней в 2 раза
            v2=f3(x*2,n+1)
            #Если и v1, и v2 приводит Ваню к победе
            #то это удовлетворительный для нас результат
            return v1 and v2
    #Если только что сходил Петя второй раз
    elif(n==3):
        #Если он выиграл
        if(x>=129):
            #это неудовлетворительный результат
            return False
        #Если он не выиграл
        else:
            #то у Вани те же 2 варианта как сходить
            #1й вариант добавить 1 камень
            v1=f3(x+1,n+1)
            #2й вариант увеличить количество камней в 2 раза
            v2=f3(x*2,n+1)
            #Если v1 или v2 приводит Ваню к победе
            #то это удовлетворительный для нас результат
            return v1 or v2
    #Если только что сходил Ваня второй раз
    elif(n==4):
        #Если он выиграл
        if(x>=129):
            #это удовлетворительный результат
            return True
        #Если он выиграть не смог, то
        #игра уже слишком затянулась
        else:
            #и это неудовлетворительный результат
            return False

#Переберем начальное кол-во камней
for S in range(1,129):
    #Если при таком кол-ве камней
    #в самом начале игры мы получаем
    #удовлетворительный результат
    if(f3(S,0)):
        #То выводим начальное кол-во
        #камней при котором это произошло
        print(S)

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

#Функция принимает 2 значения
#x - кол-во камней на текущей момент
#n - кол-во прошедших ходов
def f4(x,n):
    #Если еще никто не ходил
    if(n==0):
        #Ходит Петя
        #1й вариант добавить 1 камень
        v1=f4(x+1,n+1)
        #2й вариант увеличить количество камней в 2 раза
        v2=f4(x*2,n+1)
        #Если Ваня сможет победить как при v1, так и при v2,
        #то это удовлетворительный для нас результат
        return v1 and v2
    #Если только что сходил Петя
    elif(n==1):
        #Если он выиграл
        if(x>=129):
            #это неудовлетворительный результат
            return False
        #Если он не выиграл
        else:
            #то у Вани те же 2 варианта как сходить
            #1й вариант добавить 1 камень
            v1=f4(x+1,n+1)
            #2й вариант увеличить количество камней в 2 раза
            v2=f4(x*2,n+1)
            #Если v1 или v2 приводит Ваню к победе
            #то это удовлетворительный для нас результат
            return v1 or v2
    #Если только что сходил Ваня
    elif(n==2):
        #Если он выиграл
        if(x>=129):
            #это удовлетворительный результат
            return True
        #Если он выиграть не смог, то
        #игра уже слишком затянулась
        else:
            #и это неудовлетворительный результат
            return False

#Переберем начальное кол-во камней
for S in range(1,129):
    #Если при таком кол-ве камней
    #в самом начале игры мы получаем
    #удовлетворительный результат
    if(f4(S,0)):
        #То выводим начальное кол-во
        #камней при котором это произошло
        print(S)

Первая программа выводит 62 и 64, вторая программа выводит 64. В ответ идет то число, которое было выведено первой программой, но не было выведено второй.

Ответ: 62.

2. Демоверсия 2021

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней.
В начальный момент в первой куче было семь камней, во второй куче – S камней; 1 ≤ S ≤ 69.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

2.1. Аналитическое решение

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней.
В начальный момент в первой куче было семь камней, во второй куче – S камней; 1 ≤ S ≤ 69.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

Возьмем ветку, начинающуюся с (7;31), из предыдущего задания.

Используем ее как позицию после первого хода Пети, и распишем другие варианты развития событий для этой ситуации.

Число 30 подходит, в качестве ответа, попробуем взять число меньше, возьмем 29.

Если Петя сделает пару (8;29), то любой вариант Вани приведет его к проигрышу либо затягиванию игры.

При любом меньшем значении S все варианты ходов которые затягивали игру сейчас, будут ее затягивать и дальше. Что касается победы Пети, чтобы он не победил своим вторым ходом, в случае, когда Ваня умножал значение на 2, необходимо и достаточно, чтобы выполнялось следующее условие.


Значения от 18 до 29 точно не подойдут. Подставим S равное 17 и распишем возможные варианты развития игрового процесса.

При такой начальной позиции мы попадаем в ситуацию, что Петя может увеличить кол-во камней в первой куче в два раза, и далее либо победить вторым ходом, либо затянуть игру. 17 также не подходит. Дальнейшее уменьшение значения S будет приводить к тому, что Петя будет иметь возможность добавлять один камень в первую кучу и затягивать игровой процесс. Т.о. мы доказали, что число 30 подходит и ни одно значение меньше 30 не подходит. Наименьшее подходящее значение - это число 30.

Ответ: 30.

2.2. Программное решение

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней.
В начальный момент в первой куче было семь камней, во второй куче – S камней; 1 ≤ S ≤ 69.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

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

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

#Функция принимает 3 значения
#x - кол-во камней в первой куче на текущий момент
#y - кол-во камней во второй куче на текущий момент
#n - кол-во прошедших ходов
def f3(x,y,n):
    #Если еще никто не ходил
    if(n==0):
        #Ходит Петя
        #1й вариант добавить 1 камень в первую кучу
        v1=f3(x+1,y,n+1)
        #2й вариант увеличить количество
        #камней в первой куче в 2 раза
        v2=f3(x*2,y,n+1)
        #3й вариант добавить 1 камень в первую кучу
        v3=f3(x,y+1,n+1)
        #4й вариант увеличить количество
        #камней во второй куче в 2 раза
        v4=f3(x,y*2,n+1)
        #Если при любом ходе Пети Ваня в итоге
        #придет к победе, то это
        #удовлетворительный для нас результат
        return v1 and v2 and v3 and v4
    #Если только что сходил Петя
    elif(n==1):
        #Если он выиграл
        if(x+y>=77):
            #это неудовлетворительный результат, 
            return False
        #Если он не выиграл
        else:
            #то у Вани те же 4 варианта как сходить
            #1й вариант добавить 1 камень в первую кучу
            v1=f3(x+1,y,n+1)
            #2й вариант увеличить количество
            #камней в первой куче в 2 раза
            v2=f3(x*2,y,n+1)
            #3й вариант добавить 1 камень в первую кучу
            v3=f3(x,y+1,n+1)
            #4й вариант увеличить количество
            #камней во второй куче в 2 раза
            v4=f3(x,y*2,n+1)
            #Если Ваня сможет победить хотя бы при одном
            #из 4х вариантов то именно этот ход и будет сделан
            return v1 or v2 or v3 or v4
    #Если только что сходил Ваня
    elif(n==2):
        #Если он выиграл
        if(x+y>=77):
            #это удовлетворительный результат
            return True
        #Если он выиграть не смог
        else:
            #то у Пети те же 4 варианта как сходить
            #1й вариант добавить 1 камень в первую кучу
            v1=f3(x+1,y,n+1)
            #2й вариант увеличить количество
            #камней в первой куче в 2 раза
            v2=f3(x*2,y,n+1)
            #3й вариант добавить 1 камень в первую кучу
            v3=f3(x,y+1,n+1)
            #4й вариант увеличить количество
            #камней во второй куче в 2 раза
            v4=f3(x,y*2,n+1)
            #Если при любом ходе Пети Ваня в итоге
            #придет к победе, то это
            #удовлетворительный для нас результат
            return v1 and v2 and v3 and v4
    #Если только что сходил Петя
    elif(n==3):
        #Если он выиграл
        if(x+y>=77):
            #это неудовлетворительный результат
            return False
        #Если он выиграть не смог
        else:
            #то у Вани те же 4 варианта как сходить
            #1й вариант добавить 1 камень в первую кучу
            v1=f3(x+1,y,n+1)
            #2й вариант увеличить количество
            #камней в первой куче в 2 раза
            v2=f3(x*2,y,n+1)
            #3й вариант добавить 1 камень в первую кучу
            v3=f3(x,y+1,n+1)
            #4й вариант увеличить количество
            #камней во второй куче в 2 раза
            v4=f3(x,y*2,n+1)
            #Если Ваня сможет победить хотя бы при одном
            #из 4х вариантов то именно этот ход и будет сделан
            return v1 or v2 or v3 or v4
    #Если только что сходил Ваня
    elif(n==4):
        #Если он выиграл
        if(x+y>=77):
            #это удовлетворительный результат
            return True
        #Если он выиграть не смог
        else:
            #то игра уже слишком затянулась и
            #это неудовлетворительный результат
            return False
#Переберем начальное кол-во камней
for S in range(1,70):
    #Если при таком кол-ве камней
    #в самом начале игры мы получаем
    #удовлетворительный результат
    if(f3(7,S,0)):
        #То выводим начальное кол-во
        #камней при котором это произошло
        print(S)

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

#Функция принимает 3 значения
#x - кол-во камней в первой куче на текущий момент
#y - кол-во камней во второй куче на текущий момент
#n - кол-во прошедших ходов
def f4(x,y,n):
    #Если еще никто не ходил
    if(n==0):
        #Ходит Петя
        #1й вариант добавить 1 камень в первую кучу
        v1=f4(x+1,y,n+1)
        #2й вариант увеличить количество
        #камней в первой куче в 2 раза
        v2=f4(x*2,y,n+1)
        #3й вариант добавить 1 камень в первую кучу
        v3=f4(x,y+1,n+1)
        #4й вариант увеличить количество
        #камней во второй куче в 2 раза
        v4=f4(x,y*2,n+1)
        #Если при любом ходе Пети Ваня в итоге
        #придет к победе, то это
        #удовлетворительный для нас результат
        return v1 and v2 and v3 and v4
    #Если только что сходил Петя
    elif(n==1):
        #Если он выиграл
        if(x+y>=77):
            #это неудовлетворительный результат, 
            return False
        #Если он не выиграл
        else:
            #то у Вани те же 4 варианта как сходить
            #1й вариант добавить 1 камень в первую кучу
            v1=f4(x+1,y,n+1)
            #2й вариант увеличить количество
            #камней в первой куче в 2 раза
            v2=f4(x*2,y,n+1)
            #3й вариант добавить 1 камень в первую кучу
            v3=f4(x,y+1,n+1)
            #4й вариант увеличить количество
            #камней во второй куче в 2 раза
            v4=f4(x,y*2,n+1)
            #Если Ваня сможет победить хотя бы при одном
            #из 4х вариантов то именно этот ход и будет сделан
            return v1 or v2 or v3 or v4
    #Если только что сходил Ваня
    elif(n==2):
        #Если он выиграл
        if(x+y>=77):
            #это удовлетворительный результат
            return True
        #Если он выиграть не смог
        else:
            #то игра уже слишком затянулась и
            #это неудовлетворительный результат
            return False
#Переберем начальное кол-во камней
for S in range(1,70):
    #Если при таком кол-ве камней
    #в самом начале игры мы получаем
    #удовлетворительный результат
    if(f4(7,S,0)):
        #То выводим начальное кол-во
        #камней при котором это произошло
        print(S)

В данном примере вторая программа ничего не выводит, поэтому мы выбираем наименьшее из тех, что вывела первая программа.

Ответ: 30.