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

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

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

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

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

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

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

Ре­ше­ние.

Такое зна­че­ние S  — 64. При зна­че­ни­ях S < 64 у Пети есть воз­мож­ность сде­лать такой ход, что Ваня не смо­жет вы­иг­рать своим пер­вым ходом. При зна­че­нии S  =  64 Петя своим пер­вым ходом может по­лу­чить 65 или 128 кам­ней в куче. Во всех слу­ча­ях Ваня уве­ли­чи­ва­ет ко­ли­че­ство кам­ней в куче в два раза и вы­иг­ры­ва­ет своим пер­вым ходом.

 

Ответ: 64.

 

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

def f(x, h):

if h == 3 and x >= 129:

return 1

elif h == 3 and x < 129:

return 0

elif x >= 129 and h < 3:

return 0

else:

if h % 2 == 0:

return f(x + 1, h + 1) or f(x * 2, h + 1) # стра­те­гия по­бе­ди­те­ля

else:

return f(x + 1, h + 1) and f(x * 2, h + 1) # стра­те­гия про­иг­рав­ше­го(любой ход)

 

for x in range(1, 129):

if f(x, 1) == 1:

print(x)

break

 

При­ведём ре­ше­ние Ев­ге­ния Со­ко­ло­ва на языке Python.

def f(s, t, L, d):

if s >= t: return (-1 if L % 2 == 0 else 1)

elif L > d: return 0

else:

r1 = f(s + 1, t, L + 1, d)

r2 = f(s * 2, t, L + 1, d)

if L % 2 == 0: return max(r1, r2)

else: return min(r1, r2)

r = {'№19': [], '№20': [], '№21': []}

for s in range(1, 129):

if f(s, 129, 0, 1) != 1 and f(s, 129, 0, 2) == -1:

r['№19'].append(s)

if f(s, 129, 0, 1) != 1 and f(s, 129, 0, 3) == 1:

r['№20'].append(s)

if f(s, 129, 0, 4) == -1 and f(s, 129, 0, 2) != -1:

r['№21'].append(s)

print(r)

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