Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 129. Победителем считается игрок, сделавший последний ход, т. е. первым получивший кучу из 129 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 128.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Такое значение S — 64. При значениях S < 64 у Пети есть возможность сделать такой ход, что Ваня не сможет выиграть своим первым ходом. При значении S = 64 Петя своим первым ходом может получить 65 или 128 камней в куче. Во всех случаях Ваня увеличивает количество камней в куче в два раза и выигрывает своим первым ходом.
Ответ: 64.
Приведём другое решение на языке Python.
def f(x, h):
if h == 3 and x >= 129:
return 1
elif h == 3 and x < 129:
return 0
elif x >= 129 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, h + 1) or f(x * 2, h + 1) # стратегия победителя
else:
return f(x + 1, h + 1) and f(x * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 129):
if f(x, 1) == 1:
print(x)
break
Приведём решение Евгения Соколова на языке Python.
def f(s, t, L, d):
if s >= t: return (-1 if L % 2 == 0 else 1)
elif L > d: return 0
else:
r1 = f(s + 1, t, L + 1, d)
r2 = f(s * 2, t, L + 1, d)
if L % 2 == 0: return max(r1, r2)
else: return min(r1, r2)
r = {'№19': [], '№20': [], '№21': []}
for s in range(1, 129):
if f(s, 129, 0, 1) != 1 and f(s, 129, 0, 2) == -1:
r['№19'].append(s)
if f(s, 129, 0, 1) != 1 and f(s, 129, 0, 3) == 1:
r['№20'].append(s)
if f(s, 129, 0, 4) == -1 and f(s, 129, 0, 2) != -1:
r['№21'].append(s)
print(r)

