Для игры, описанной в задании 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])])

