19
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, в одной куче \(10\) камней, а в другой \(5\) камней; такую позицию в игре обозначим \((10, \, 5).\) Тогда за один ход можно получить любую из четырёх позиций: \((11, \, 5),\) \((20, \, 5),\) \((10, \, 6),\) \((10, \, 10).\) Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее \(211.\) Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах \(211\) или больше камней.
В начальный момент в первой куче \(17\) камней, во второй куче — \(S\) камней; \(1 \leqslant S \leqslant 193.\)
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение \(S,\) когда такая ситуация возможна.
20
Для игры, описанной в задании 19, найдите два таких значения \(S,\) при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
Найденные значения запишите в ответе в порядке возрастания.
21
Для игры, описанной в задании 19, найдите минимальное значение \(S,\) при котором одновременно выполняются два условия:
Решение:
Python
def moves(h):
h1, h2 = h
return (h1 + 1, h2), (2 * h1, h2), (h1, h2 + 1), (h1, 2 * h2)
def game_over(h):
return sum(h) >= 211
def win1(h):
return not game_over(h) and any(game_over(m) for m in moves(h))
def lose1(h):
return not win1(h) and all(win1(m) for m in moves(h))
def lose1_bad(h):
return not win1(h) and any(win1(m) for m in moves(h))
def win2(h):
return not win1(h) and any(lose1(m) for m in moves(h))
def lose2(h):
return all(win1(m) or win2(m) for m in moves(h)) and \
any(win2(m) for m in moves(h))
z19 = [S for S in range(1, 194) if lose1_bad((17, S))]
z20 = [S for S in range(1, 194) if win2((17, S))]
z21 = [S for S in range(1, 194) if lose2((17, S))]
print(min(z19))
print(*z20)
print(min(z21))
Ответ:
\(49\)
\(88 \,\, 96\)
\(87\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене