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

Два иг­ро­ка, Петя и Ваня, иг­ра­ют в сле­ду­ю­щую игру. Перед иг­ро­ка­ми лежит куча кам­ней. Иг­ро­ки ходят по оче­ре­ди, пер­вый ход де­ла­ет Петя. Если ко­ли­че­ство кам­ней в куче де­лит­ся на целое k (2 ≤ k ≤ 9), то игрок может убрать из кучи k кам­ней. Если ко­ли­че­ство кам­ней в куче не де­лит­ся ни на одно из ука­зан­ных чисел, игрок уби­ра­ет один ка­мень, после чего вы­пол­ня­ет ход по опи­сан­но­му выше пра­ви­лу.

 

На­при­мер, если в куче 12 кам­ней, то за один ход можно убрать 2, 3, 4 или 6 кам­ней, а если в куче 11 кам­ней, то игрок за один ход сна­ча­ла уби­ра­ет один ка­мень (остаётся 10), а затем уби­ра­ет 2 или 5 кам­ней.

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

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

В на­ча­ле игры в куче было S кам­ней, S > 9.

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

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

Ре­ше­ние.

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

def Win(m, h):

return 0 if m <= 9 else any([Lose(m-k, h-1) for k in K]) \

if (K:=[i for i in range(2, 10) if not m%i]) else Win(m-1, h-1)

def Lose(m, h):

return 1 if m <= 9 else 0 if not h else all([Win(m-k, h-1) for k in K]) \

if (K:=[i for i in range(2, 10) if not m%i]) else Lose(m-1, h-1)

 

print('19)', [s for s in range(10, 50) if not Win(s, 1) and Lose(s, 2)][0])

 

Ответ: 15.


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

Источник: Стат­Град: Тре­ни­ро­воч­ная ра­бо­та 28.01.2025 ИН2410302