Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. Если в куче
Например, если в куче 12 камней, то за один ход можно добавить
Игра завершается, когда количество камней в куче становится
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет
В начале игры в куче было
Укажите количество таких
Приведём решение на языке Python.
from functools import lru_cache
def f(n):
cisla = []
for k in range(2, n + 1):
if n % k == 0:
cisla.append(n + n // k)
return cisla
@lru_cache
def game(n):
if any(x > 45 for x in f(n)):
return 'vic'
if all (game(x)=='vic' for x in f(n)):
return 'loss1'
if any (game(x)=='loss1' for x in f(n)):
return 'vic2'
if all (game(x)=='vic' or game(x) == 'vic2' for x in f(n)):
return 'loss2'
z_19 = []
z_20 = []
z_21 = []
for n in range(2,46):
if game(n) =='loss1':
z_19.append(n)
if game(n) =='vic2':
z_20.append(n)
if game(n) =='loss2':
z_21.append(n)
print(len(z_19))
print(min(z_20), max(z_20))
print(min(z_21))
Ответ: 6.
Приведём решение Льва Андреева на языке Python.
def f(x, z):
if x > 45: return z%2==0
if z == 0: return 0
h = [f(x + x//i, z-1) for i in range(2, x+1) if x % i == 0]
if (z-1)%2==0:
return any(h)
return all(h)
print(19, len([s for s in range(2, 45) if f(s, 2)]))
print(20, [s for s in range(1, 45) if (not f(s, 1)) and f(s, 3)])
print(21, [s for s in range(1, 45) if ((f(s, 2)) or f(s, 4)) and (not f(s, 2))])

