# 31365
def f(a,b,m): #a-первая куча, b-вторая куча, (порядок не важен), m - количество оставшихся ходов
if a+b<=47: # условие выигрыша
return m%2==0 # возвращаем истину, если m=0 (для задания 21 и для m=2, к.т. Ваня мог выиграть за 2 или 4 хода)
if m==0: # выигрыша нет, но ходы закончились
return 0 # возвращаем ложь
h = [f(a-2,b,m-1), f(a,b-2,m-1), f(a//3,b, m-1), f(a,b//3,m-1)]
return any(h) if (m-1)%2 ==0 else all(h)
print(19, [s for s in range(32,116) if f(16,s,2)]) # range смотрим по условию задачи, в случае убывания правую границу выбираем сами
print(20, [s for s in range(32,300) if not f(16,s,1) and f(16,s,3)]) # не забываем ставить not
print(21, [s for s in range(32,300) if not f(16,s,2) and f(16,s,4)]) # не забываем ставить not
# Не забываем везде указывать функцию f(a,b,m), а не (a,b,m), т.к. кортеж всегда будет принимать значение Истина