Задания
Версия для печати и копирования в MS Word
Тип 19 № 81803
i

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

—  убрать из кучи 3 камня;

—  убрать из кучи 5 кам­ней;

—  умень­шить ко­ли­че­ство кам­ней в куче в 4 раза (ко­ли­че­ство кам­ней, по­лу­чен­ное при де­ле­нии, округ­ля­ет­ся до мень­ше­го).

На­при­мер, из кучи в 20 кам­ней за один ход можно по­лу­чить кучу из 17, 15 или 5 кам­ней.

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

По­бе­ди­те­лем счи­та­ет­ся игрок, сде­лав­ший по­след­ний ход, то есть пер­вым по­лу­чив­ший кучу из 30 или менее кам­ней. В на­чаль­ный мо­мент в куче было S кам­ней, S ≥ 31.

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

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

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

def f(x, h):

if h == 3 and x <= 30:

return 1

elif h == 3 and x > 30:

return 0

elif x <= 30 and h < 3:

return 0

else:

if h % 2 == 0:

return f(x - 3, h + 1) or f(x - 5, h + 1) or f(x // 4, h + 1)

else:

return f(x - 3, h + 1) and f(x - 5, h + 1) and f(x // 4, h + 1)

for x in range(1000):

if f(x, 1) == 1:

print(x)

break

 

Ответ: 124.

 

При­ведём ана­ли­ти­че­ское ре­ше­ние Алек­сандра Коз­ло­ва.

Ре­ше­ние задач с ка­меш­ка­ми ме­то­дом «Лун­ная по­ход­ка»

За­да­ча 19

Ана­лиз по­зи­ции: Мы ищем ко­ли­че­ство кам­ней в куче, не­об­хо­ди­мое и до­ста­точ­ное для по­бе­ды Пети, ко­то­рый де­ла­ет пер­вый ход. Из­вест­но, что Петя вы­иг­ры­ва­ет, если ко­ли­че­ство кам­ней в куче со­став­ля­ет от 31 до 120 (по­сколь­ку 120/4 = 30).

Про­вер­ка по­зи­ций: На­чи­на­ем с 121 и дви­жем­ся вниз, про­ве­ряя каж­дую по­зи­цию, чтобы опре­де­лить, может ли Петя вы­иг­рать. Метод «Лун­ная по­ход­ка» за­клю­ча­ет­ся в том, чтобы от­сту­пать от вы­иг­рыш­ных по­зи­ций и про­ве­рять, как они вли­я­ют на те­ку­щую.

По­зи­ция 121: 121/4=30.25 ==30 (округ­ля­ет­ся до 30)  — вы­иг­рыш­ная для Пети.

По­зи­ция 122: 122/4=30.50 == 30 (округ­ля­ет­ся до 30)  — вы­иг­рыш­ная для Пети.

По­зи­ция 123: 123/4=30.75 == 30 (округ­ля­ет­ся до 30)  — вы­иг­рыш­ная для Пети.

Вывод 1: Ходы из по­зи­ций 31, 32, …, 121, 122 или 123  — вы­иг­рыш­ные.

Про­дол­жа­ем про­вер­ку сле­ду­ю­щих по­зи­ций:

По­зи­ция 124: После лю­бо­го хода Пети на­при­мер, 124/4=31, 124−5=119 или 124−3=121, Ваня все­гда вы­иг­ры­ва­ет. Это про­иг­рыш­ная по­зи­ция для Пети.

По­зи­ция 125: Ана­ло­гич­но, Ваня вы­иг­ры­ва­ет.

По­зи­ция 126: Тоже про­иг­рыш­ная для Пети.

Вывод 2: Ходы из по­зи­ций 124, 125 и 126 при­во­дят к про­иг­ры­шу пер­во­го иг­ро­ка, но яв­ля­ют­ся вы­иг­рыш­ны­ми для вто­ро­го.

Ответ на за­да­чу 19: Ми­ни­маль­ное зна­че­ние S=124

 

При­ведём ре­ше­ние Алек­сандра Коз­ло­ва на языке Python.

from functools import *

def m(h):

return h//4,h-3,h-5

@lru_cache(None)

def g(h):

if h<=30:return 'w'

if any(g(i)=='w' for i in m(h)):return 'p1'

if all(g(i)=='p1' for i in m(h)):return 'v1'

if any(g(i)=='v1' for i in m(h)):return 'p2'

if all(g(i)=='p1' or g(i)=='p2' for i in m(h)):return 'v2'

for i in range(120,140):

if g(i)!= None and g(i)!='w':

print(i,g(i))


Аналоги к заданию № 81485: 81803 Все

Источник: Де­мон­стра­ци­он­ная вер­сия ЕГЭ−2026 по ин­фор­ма­ти­ке