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

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

Ответ:

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

Ре­ше­ние.

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

def f(x, h):

delit = [k for k in range(2, 10) if x % k == 0]

if x <= 15:

return h % 2 == 0

elif h == 0:

return 0

elif not any(x % k == 0 for k in range(2, 10)):

x -= 1

elif (h-1)%2 ==0:

return any(f(x-k, h-1) for k in delit)

else:

return all(f(x-k, h-1) for k in delit)

for x in range(16, 100):

if not (f(x,1)) and f(x,3):

print('За­да­ча 20:',x)

 

Ответ: 24; 30.

 

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

def divisor(s):

for i in range(2, s+1):

if s % i == 0:

break

return 2 <= i <= 9

def g(s, p, end):

if s <= 15: return p in end

if p > max(end): return False

if not divisor(s):

s -= 1

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

else:

moves = [g(s-k, p+1, end) for k in range(2, 10) 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])])

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


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