Python
# 1 куча
def f(s, m):
if s >= 132: return m % 2 == 0
if m == 0: return 0
h = [f(s+3, m-1), f(s+6, m-1), f(s*3, m-1)]
return any(h) if m % 2 != 0 else all(h)
print('#19', min(s for s in range(1,132) if f(s, 2)))
print('#20', [s for s in range(1,132) if not f(s,1) and f(s,3)])
print('#21', min(s for s in range(1,132) if not f(s,2) and f(s,4))) Способ 2
# 2 кучи
def f(x, y, m):
if x + y >= 77: return m % 2 == 0
if m == 0: return 0
h = [f(x+3,y,m-1), f(x*3,y,m-1),
f(x,y+3,m-1), f(x,y*3,m-1)]
return any(h) if m % 2 != 0 else all(h)
print('#19', min(s for s in range(1,65) if f(12,s,2)))
print('#20', [s for s in range(1,65) if not f(12,s,1) and f(12,s,3)])
print('#21', [s for s in range(1,65) if not f(12,s,2) and f(12,s,4)])
# Отрезки
def f(x, m):
if 105 >= x >= 97: return m % 2 == 0
if x > 105: return m % 2 != 0
if m == 0: return 0
h = [f(x+3, m-1), f(x+5, m-1), f(x*3, m-1)]
return any(h) if m % 2 != 0 else all(h) 📚 Теория
Теория игр: победные и проигрышные позиции. any() — текущий игрок выбирает лучший ход, all() — противник играет оптимально.