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

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

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

Ре­ше­ние.

Из 20 за­да­чи най­де­но ми­ни­маль­ное зна­че­ние кучи кам­ней для по­бе­ды вто­рым ходом-30. Тогда, для по­бе­ды Вани, ему не­об­хо­ди­мо по­лу­чить кучу из 30 кам­ней или боль­ше, при любой игре Пети. Ми­ни­маль­ная куча в таком слу­чае-29 кам­ней. Петя может до­ба­вить или 1 или 29 кам­ней. Если Петя до­ба­вит 29 кам­ней, Ваня вы­иг­ра­ет пер­вым ходом. Если Петя до­бав­ля­ет один ка­мень, тогда Ваня де­ла­ет кучу 45 кам­ней и вы­иг­ры­ва­ет своим вто­рым ходом.

 

Ответ: 29.

 

При­ве­дем ре­ше­ние Мар­га­ри­ты Фаль­ко на языке Python.

def g(s, p, end):

if s > 91: return p in end

if p > max(end): return False

moves = [g(s + k, p+1, end) for k in range(1, s+1) if s % k == 0]

return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)

print('19', [s for s in range(16, 100) if g(s, 0, [2])])

print('20', [s for s in range(16, 100) if g(s, 0, [3]) and not g(s, 0, [1])])

print('21', [s for s in range(16, 100) if g(s, 0, [2, 4]) and not g(s, 0, [2])])