Задание 20 ЕГЭ по информатике: кучи камней и выигрышная стратегия

Подтемы

Что проверяет задание

Задание 20 проверяет умение анализировать игру двух участников с полной информацией и конечным числом ходов. Нужно построить логику «от конца игры к началу» — определить, какие позиции выигрышные, какие проигрышные, и на основе этого найти конкретные числовые значения начального количества камней SS, удовлетворяющие условиям задачи. Здесь проверяются не программирование и не перебор кода, а строгая логика и аккуратная работа с неравенствами и множествами чисел.

Задача моделирует игру: есть куча (или две кучи) камней, игроки по очереди делают ходы по фиксированным правилам, игра заканчивается, когда количество камней достигает порога NN, победителем становится тот, кто сделал последний ход. Обычно рассматриваются три связанные подзадачи, и задание, о котором идёт речь, — вторая из них: нужно найти значения SS, при которых первый игрок не может выиграть за один ход, но гарантированно выигрывает своим вторым ходом.

Как выглядит формулировка и сколько баллов

Типичная формулировка: два игрока по очереди изменяют кучу камней — добавляют определённое число камней или умножают кучу на константу. Игра завершается, когда куча становится не менее NN. Победил тот, кто сделал последний ход. Задано, что 1≤S≤N−11 \le S \le N-1. Нужно найти все значения SS, при которых первый игрок (обычно Петя) имеет выигрышную стратегию, причём одновременно:

  • он не может выиграть за один ход;
  • он гарантированно выигрывает своим вторым ходом, независимо от игры второго игрока (Вани).

Это задание входит в блок из трёх пунктов (20.1, 20.2, 20.3), каждый оценивается в 1 балл, то есть всё задание может принести до 3 баллов. Ответ записывается как последовательность цифр — найденные значения SS в порядке возрастания без разделителей.

Что нужно знать

  • Позиция — состояние игры, то есть количество камней в куче (для одной кучи) или пара чисел (x,y)(x,y) (для двух куч).
  • Выигрышная позиция (В) — позиция, из которой игрок, делающий ход, может гарантированно довести игру до победы при любых ответах соперника.
  • Проигрышная позиция (Л) — позиция, из которой любой ход ведёт в выигрышную позицию для соперника.
  • Ход: если разрешены операции «добавить aa», «добавить bb», «умножить на kk», то из позиции xx достижимы позиции x+a,  x+b,  kxx+a,\; x+b,\; kx.
  • Условие завершения игры: игра заканчивается, когда позиция x≥Nx \ge N; сделавший такой ход побеждает.
  • Множество F1F_1 — позиции, из которых можно выиграть одним ходом: F1={x<N:  x+a≥N ∨ x+b≥N ∨ kx≥N}.F_1=\{x<N:\; x+a\ge N \ \lor\ x+b\ge N \ \lor\ kx\ge N\}.
  • Множество F2F_2 — позиции, из которых игрок гарантированно выигрывает своим вторым ходом. Это те t∉F1t\notin F_1, для которых все возможные ходы соперника переводят игру в позицию из F1F_1, и при этом ни один ход соперника не завершает игру раньше времени: F2={t∉F1:  (t+a∈F1)∧(t+b∈F1)∧(kt∈F1),  все результаты<N}.F_2=\{t\notin F_1:\; (t+a\in F_1)\land(t+b\in F_1)\land(kt\in F_1),\; \text{все результаты}<N\}.
  • Общий принцип: FkF_k строится через Fk−1F_{k-1} по той же логике — обратная индукция от конца игры.

Методы решения

1. Обратная индукция для одной кучи со сложением. Строим F1F_1 как множество чисел, близких к порогу NN — обычно это непрерывный отрезок [N−c,  N−1][N-c,\;N-1], где cc — наибольший шаг сложения. Пример: если ходы +1+1 и +3+3, N=10N=10, то F1={7,8,9}F_1=\{7,8,9\}, так как 7+3=107+3=10.

2. Обратная индукция с умножением. Умножение обычно расширяет F1F_1 «вниз» сильнее, чем сложение, поэтому именно операция умножения часто определяет левую границу множества. Пример: ход ×2\times 2, N=20N=20 добавляет в F1F_1 все x≥10x\ge10, так как 2⋅10=202\cdot10=20.

3. Анализ периодичности (для больших NN). Если множество F1F_1 — сплошной интервал, часто оказывается, что и вся структура В/Л-позиций периодична с шагом, равным сумме или НОК шагов ходов. Это полезно для задач с большим диапазоном SS, где перебор занял бы много времени.

4. Двумерный анализ для двух куч. Если есть две кучи (x,y)(x,y), а ход — это изменение одной из них (например, добавить камни в одну кучу или удвоить одну кучу), позицию нужно рассматривать как пару. Множества F1,F2,…F_1, F_2,\dots строятся аналогично, но состоят из пар чисел; часто удаётся свести задачу к одной переменной — сумме x+yx+y или максимуму max⁡(x,y)\max(x,y), если правила симметричны относительно куч.

5. Табличный перебор для контроля. Для небольших NN полезно построить таблицу «позиция — статус (В/Л) — куда ведут ходы» вручную от N−1N-1 до 11. Это медленный, но безошибочный способ проверки правильности построенных множеств F1,F2F_1, F_2.

Алгоритм решения по шагам

  1. Выпишите порог NN и разрешённые операции (например, +a+a, +b+b, ×k\times k).
  2. Постройте множество F1F_1: решите неравенства x+a≥Nx+a\ge N, x+b≥Nx+b\ge N, kx≥Nkx\ge N и объедините решения — это позиции, из которых можно выиграть одним ходом.
  3. Найдите дополнение к F1F_1 на отрезке [1,N−1][1,N-1] — назовём его «не-F1F_1». Это позиции, из которых первым ходом победить нельзя.
  4. Постройте множество F2F_2: среди чисел не-F1F_1 найдите такие tt, что все три результата ходов из tt (t+at+a, t+bt+b, ktkt) одновременно строго меньше NN и принадлежат F1F_1. Обязательно проверяйте оба условия — если хотя бы один ход соперника заканчивает игру (≥N\ge N), такое tt не подходит, потому что тогда выиграет соперник, а не наш игрок.
  5. Найдите искомые SS: среди чисел не-F1F_1 отберите те, из которых хотя бы одним ходом можно попасть в множество F2F_2 (решите уравнения S+a=tS+a=t, S+b=tS+b=t, kS=tkS=t для каждого t∈F2t\in F_2, проверяя целочисленность и попадание в допустимый диапазон).
  6. Отсортируйте найденные значения по возрастанию и запишите ответ подряд без разделителей.

Разбор примеров

Пример 1. Порог N=68N=68, ходы: +1+1, +4+4, ×5\times5.

Шаг 1 — строим F1F_1: решаем x+1≥68x+1\ge68 (x≥67x\ge67), x+4≥68x+4\ge68 (x≥64x\ge64), 5x≥685x\ge68 (x≥13,6x\ge13{,}6, то есть x≥14x\ge14). Самое слабое условие — x≥14x\ge14, оно покрывает и остальные. Значит F1={14,15,…,67}F_1=\{14,15,\dots,67\}, а не-F1={1,…,13}F_1=\{1,\dots,13\}.

Шаг 2 — строим F2F_2 среди t∈{1,…,13}t\in\{1,\dots,13\}. Нужно, чтобы t+1,  t+4,  5tt+1,\;t+4,\;5t были одновременно <68<68 и ≥14\ge14. Условие 5t<685t<68 даёт t≤13t\le13. Условие t+1≥14t+1\ge14 даёт t≥13t\ge13. Значит единственное подходящее значение — t=13t=13. Проверка: 13+1=1413+1=14, 13+4=1713+4=17, 5⋅13=655\cdot13=65 — все три числа лежат в [14,67]=F1[14,67]=F_1 и меньше 6868. Значит F2={13}F_2=\{13\}.

Шаг 3 — ищем S∈{1,…,13}S\in\{1,\dots,13\}, из которого один ход даёт 1313: S+1=13⇒S=12S+1=13\Rightarrow S=12; S+4=13⇒S=9S+4=13\Rightarrow S=9; 5S=135S=13 — не целое. Получаем S=9S=9 и S=12S=12.

Ответ: 912.

Пример 2. Порог N=42N=42, ходы: +1+1, +3+3, ×2\times2.

F1F_1: x+1≥42x+1\ge42 (x≥41x\ge41), x+3≥42x+3\ge42 (x≥39x\ge39), 2x≥422x\ge42 (x≥21x\ge21). Слабейшее условие x≥21x\ge21 покрывает остальные, поэтому F1={21,…,41}F_1=\{21,\dots,41\}, не-F1={1,…,20}F_1=\{1,\dots,20\}.

F2F_2: нужно t+1,  t+3,  2tt+1,\;t+3,\;2t одновременно <42<42 и ≥21\ge21. Из 2t<422t<42 следует t≤20t\le20. Из t+1≥21t+1\ge21 следует t≥20t\ge20. Значит t=20t=20. Проверка: 20+1=2120+1=21, 20+3=2320+3=23, 2⋅20=402\cdot20=40 — всё в F1F_1 и меньше 4242. F2={20}F_2=\{20\}.

Ищем SS: S+1=20⇒S=19S+1=20\Rightarrow S=19; S+3=20⇒S=17S+3=20\Rightarrow S=17; 2S=20⇒S=102S=20\Rightarrow S=10.

Ответ по возрастанию: 101719.

Пример 3. Порог N=48N=48, ходы: +1+1, +4+4, ×2\times2.

F1F_1: x≥47x\ge47, x≥44x\ge44, x≥24x\ge24 — самое слабое условие x≥24x\ge24. Значит F1={24,…,47}F_1=\{24,\dots,47\}, не-F1={1,…,23}F_1=\{1,\dots,23\}.

F2F_2: нужно t+1,  t+4,  2tt+1,\;t+4,\;2t одновременно <48<48 и ≥24\ge24. 2t<48⇒t≤232t<48\Rightarrow t\le23. t+1≥24⇒t≥23t+1\ge24\Rightarrow t\ge23. Значит t=23t=23. Проверка: 23+1=2423+1=24, 23+4=2723+4=27, 2⋅23=462\cdot23=46 — всё подходит. F2={23}F_2=\{23\}.

Ищем SS: S+1=23⇒S=22S+1=23\Rightarrow S=22; S+4=23⇒S=19S+4=23\Rightarrow S=19; 2S=232S=23 — не целое.

Ответ по возрастанию: 1922.

Во всех трёх примерах видна одна и та же логика: сначала находится единственная (или несколько) «переходная» позиция tt, из которой соперник обязан подарить победу, а затем ищутся ходы, ведущие именно в эту позицию.

Типичные ошибки и ловушки

  • Забывают проверить, что ход соперника не завершает игру досрочно. Если хотя бы один из ходов из tt даёт результат ≥N\ge N, соперник сам выиграет этим ходом — такое tt нельзя включать в F2F_2, даже если оставшиеся ходы формально попадают в F1F_1.
  • Путают «существует ход» и «все ходы». Для F1F_1 достаточно существования хотя бы одного выигрывающего хода. Для F2F_2 требуется, чтобы абсолютно все ходы соперника вели в F1F_1 — здесь нельзя ослаблять условие.
  • Не проверяют целочисленность и границы. При решении уравнений вида kS=tkS=t важно убирать нецелые и выходящие за диапазон 1≤S≤N−11\le S\le N-1 решения.
  • Путают порядок операций умножения и сложения при построении F1F_1. Умножение обычно расширяет множество сильнее сложения — стоит явно решить неравенство для каждой операции отдельно и объединить результаты.
  • Для двух куч забывают рассмотреть ход по каждой из куч отдельно. Нужно перебрать все допустимые операции применительно к xx и к yy по отдельности, а не только к их сумме.
  • Путают, кто первый ходит. Если по условию первым ходит не тот игрок, для которого ищется стратегия, знаки и порядок множеств F1,F2F_1, F_2 нужно интерпретировать относительно чужого хода.

Как готовиться

  • Начните с ручного построения таблицы позиций для маленьких значений NN (10–20), чтобы прочувствовать логику В/Л-позиций без спешки.
  • Освойте формальную запись множеств F1,F2,F3F_1, F_2, F_3 через неравенства — это ускоряет решение и снижает число ошибок по сравнению с полным перебором.
  • Прорешайте задачи всех трёх типов подряд (обычная стратегия, победа вторым ходом, подсчёт количества стратегий), чтобы видеть общую структуру и различия между ними.
  • Для самоконтроля напишите короткую программу (даже на псевдокоде), которая строит множества FkF_k автоматически, и сравнивайте с ручным решением — так быстро находятся ошибки в границах.
  • Регулярно решайте задачи с разными комбинациями операций: только сложение, сложение и умножение, сложение и деление — чтобы не привыкать к одному шаблону.
  • Отдельно потренируйтесь на теме «две кучи»: там важно аккуратно перебирать ходы по каждой куче и следить, не сводится ли задача к анализу одной переменной (суммы или разности).

Частые вопросы

Что означает «выигрышная стратегия» в этих задачах?

Это возможность игрока выбирать ходы так, чтобы гарантированно победить при любых действиях соперника, а не только при удачном для него раскладе.

Как найти множество F1?

Нужно решить неравенства для каждой разрешённой операции (сложение, умножение), при которых результат хода становится не меньше порога N, и объединить полученные решения.

Почему важно проверять, что ход соперника не завершает игру раньше времени?

Если ход соперника из позиции t сразу даёт результат больше или равный порогу, то победителем становится соперник, а не тот, для кого строится стратегия, поэтому такую позицию t нельзя включать в множество F2.

Чем отличается задача про одну кучу от задачи про две кучи?

В задаче с одной кучей позиция описывается одним числом, а в задаче с двумя кучами — парой чисел, и ход применяется к одной из двух куч, поэтому множества позиций строятся в двумерном виде.

Нужно ли учитывать порядок ходов при построении F2?

Да, F2 строится относительно всех возможных ходов соперника из промежуточной позиции: обязательно проверяются все варианты его хода, а не только один удобный.

Как проверить правильность найденных значений S?

Можно построить таблицу позиций вручную для небольшого диапазона чисел рядом с порогом N и убедиться, что логика ходов совпадает с построенными множествами F1 и F2.

Что делать, если операций хода больше двух-трёх?

Принцип остаётся тот же: для каждой операции решается своё неравенство при построении F1, а при построении F2 проверяется, что все операции без исключения ведут в F1.