19. Два игрока, Сергей и Анатолий, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, 
первый ход делает Сергей. За один ход игрок может из каждой кучи убрать по три камня или убрать целиком одну кучу, а другую 
разделить на две равные (если это позволяет количество камней).
Игра завершается после того хода, когда хотя бы одна куча становится пустой или когда невозможно сделать очередной ход по правилам. 
Побеждает тот, кто сделал последний ход. В начальный момент времени в одной куче лежит N камней, а в другой — К камней.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — 
значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.
Известно, что после неудачного первого хода Сергея Анатолий выиграл первым своим ходом. При каком наибольшем значении К это возможно, 
если N = 32?

20. Найти все такие значения К при которых у Сергея есть вигрышная стратегия:
- Сергей не может выиграть за один ход;
- Сергей может выиграть своим вторым ходом независимо от того, как сыграет Анатолий.

21. При N = 20, найти наибольшее значение K, при котором у Анатолия есть выигрышнаяя стратегия, позволяющая ему
выиграть своим первым или вторым ходом.

--------------------------------
Ответ действительно 8. Сергей сделал неудачный ход, убрав кучу из 32 камней и разделив К пополам.
В обеих кучах стало по 4 камня. Анатолий убрал из каждой кучи по три камня и сделал обе кучи =1, после чего Сергей уже не мог сделать 
ход и проиграл
Если в куче К более 8 камней, то свести количество в обеих кучах к 1 за два хода не удастся, а остальные варианты более длинные.

--------------------------------
# №19 Кулабухова
def f(s1,s2,c,m):
    if s1 ==0 or  s2 == 0: return c%2 == m%2

    h =[]
    if s1>=3 and s2 >= 3: h.append(f(s1-3,s2-3,c+1,m))
    if s1%2==0: h.append(f(s1//2, s1//2, c + 1, m))
    if s2%2==0: h.append(f(s2//2, s2//2, c + 1, m))
    if len(h)==0: return c%2 == m%2
    if c == m: return 0

    return any(h) if (c+1)%2==m%2 else any(h)
for s2 in range (1,50):
    for m in range(1,5):
        if f(32,s2,0,m):
            if m==2:
                print(s2,m)
                break
#ответ 8
------------------------------------------------------
# №20 Кулабухова
def f(s1,s2,c,m):
    if s1 ==0 or  s2 == 0: return c%2 == m%2

    h =[]
    if s1>=3 and s2 >= 3: h.append(f(s1-3,s2-3,c+1,m))
    if s1%2==0: h.append(f(s1//2, s1//2, c + 1, m))
    if s2%2==0: h.append(f(s2//2, s2//2, c + 1, m))
    if len(h)==0: return c%2 == m%2
    if c == m: return 0

    return any(h) if (c+1)%2==m%2 else all(h)
for s2 in range (1,50):
    for m in range(1,5):
        if f(32,s2,0,m):
            if m==3:
                print(s2,m)
            break
#ответ 8 9 10 12 14
--------------------------------------------------

# №21 Кулабухова
def f(s1,s2,c,m):
    if s1 ==0 or  s2 == 0: return c%2 == m%2

    h =[]
    if s1>=3 and s2 >= 3: h.append(f(s1-3,s2-3,c+1,m))
    if s1%2==0: h.append(f(s1//2, s1//2, c + 1, m))
    if s2%2==0: h.append(f(s2//2, s2//2, c + 1, m))
    if len(h)==0: return c%2 == m%2
    if c == m: return 0

    return any(h) if (c+1)%2==m%2 else all(h)
for s2 in range (1,50):
    for m in range(1,5):
        if f(20,s2,0,m):
            if m==2 or m==4:
                print(s2,m)
            #break
#ответ 17