В задаче Project Euler 798 требуется подсчитать начальные наборы открытых карт, проигрышные для первого игрока. В колоде есть \(s\) мастей, в каждой масти лежат карты со значениями от \(1\) до \(n\). За ход разрешено накрыть открытую карту картой той же масти с большим значением. Игрок, которому некуда ходить, проигрывает.
Прямой перебор здесь бесполезен: начальных наборов \(2^{ns}\), а для каждого набора пришлось бы исследовать дерево игры. Решение строится в три содержательных этапа:
Самая трудная часть — не само преобразование, а точная классификация позиций одной масти. В ранних обсуждениях задачи встречается неполная формулировка этой классификации. Ниже используется исправленное условие, отдельно разбирается причина дополнительного ограничения и после этого проводится комбинаторный подсчёт.
В одной масти имеются карты
\[ 1,2,\ldots,n. \]
Перед началом игры выбирается произвольное подмножество карт, в том числе пустое. Выбранные карты кладутся на стол лицом вверх и образуют начальные стопки высоты \(1\).
Ход выбирает:
Карта \(X\) кладётся на \(Y\). После этого \(Y\) закрыта навсегда, а \(X\) становится верхней картой соответствующей стопки.
Игра конечна: каждый ход забирает из неиспользованной части колоды ровно одну карту. Правила одинаковы для обоих игроков, случайности и скрытой информации нет, а проигрывает игрок без допустимого хода. Следовательно, перед нами конечная беспристрастная игра с нормальным условием окончания.
Обозначим через \(C(n,s)\) число начальных наборов, проигрышных для первого игрока при оптимальной игре обоих участников.
Карта одной масти никогда не накрывает карту другой масти. Поэтому любой ход изменяет состояние ровно одной масти и не затрагивает остальные.
Полная позиция имеет вид
\[ P=P_1+P_2+\cdots+P_s, \]
где \(P_j\) — позиция внутри \(j\)-й масти, а знак \(+\) означает дизъюнктную сумму игр: игрок выбирает одну компоненту и делает ход только в ней.
Для таких игр применима теорема Шпрага—Гранди. Каждой позиции \(P\) сопоставляется неотрицательное целое число
\[ g(P)=\operatorname{mex}\{g(Q):P\to Q\}, \]
где \(\operatorname{mex}\) — наименьшее неотрицательное число, отсутствующее в заданном множестве, а \(P\to Q\) означает допустимый ход из \(P\) в \(Q\).
Для дизъюнктной суммы выполняется
\[ g(P_1+\cdots+P_s) = g(P_1)\oplus\cdots\oplus g(P_s), \]
где \(\oplus\) — побитовое исключающее «или».
Позиция проигрышна для игрока, которому предстоит ход, тогда и только тогда, когда её число Гранди равно нулю. Поэтому исходная задача эквивалентна подсчёту наборов мастей, для которых
\[ g(P_1)\oplus g(P_2)\oplus\cdots\oplus g(P_s)=0. \]
Отсюда видно, почему недостаточно отдельно посчитать проигрышные состояния каждой масти и перемножить результаты. Общая позиция может быть проигрышной и тогда, когда все отдельные нимберы ненулевые. Например,
\[ 5\oplus5=0. \]
Сначала необходимо узнать полное распределение нимберов одной масти.
После того как карта оказалась накрыта, она больше никогда не участвует в игре. Её числовое значение не влияет на будущие допустимые ходы. Поэтому после каждого хода закрытую карту можно мысленно удалить.
Более того, правила используют только сравнение значений. Если из оставшихся карт удалить одну карту и сохранить взаимный порядок остальных, их можно заново пронумеровать последовательными целыми числами. Дерево будущих ходов от этого не изменится.
Неиспользованные карты, которые меньше всех текущих верхних карт, также можно отбросить: ни на одну открытую карту их положить нельзя, а новые верхние карты в ходе игры только увеличиваются. В обращённой нумерации это означает, что свободный хвост справа от последней занятой координаты не хранится.
Это позволяет описывать позицию не всей историей стопок, а только относительным расположением текущих верхних карт среди ещё активных карт.
Пусть в одной масти открыты карты
\[ r_1<r_2<\cdots<r_k. \]
Введём обращённые координаты
\[ x_i=n-r_{k-i}, \qquad 0\le i<k. \]
Тогда
\[ 0\le x_0<x_1<\cdots<x_{k-1}. \]
Большая исходная карта получает меньшую обращённую координату. Поэтому требование «положить большую карту» превращается в движение влево, к меньшему числу.
Начальное подмножество одной масти однозначно задаёт подмножество множества
\[ \{0,1,\ldots,n-1\}. \]
Пустому начальному набору соответствует пустой кортеж.
Пусть текущее состояние равно
\[ X=(x_0,x_1,\ldots,x_{k-1}). \]
Выберем \(x_i\) и свободную позицию \(y\), для которой
\[ 0\le y<x_i, \qquad y\notin\{x_0,\ldots,x_{i-1}\}. \]
После хода старая верхняя карта \(x_i\) удаляется. Все координаты справа от неё уменьшаются на единицу из-за перенумерации оставшихся активных карт. Новое состояние имеет вид
\[ X' = \operatorname{sort} \bigl( x_0,\ldots,x_{i-1}, y, x_{i+1}-1,\ldots,x_{k-1}-1 \bigr). \]
Количество открытых стопок \(k\) не меняется. Терминальной является позиция
\[ (0,1,\ldots,k-1), \]
поскольку левее каждой открытой карты уже нет свободной позиции. Пустое состояние также терминально.
Такое описание удобно по двум причинам:
Рассмотрим непустое состояние
\[ X=(x_0,\ldots,x_{k-1}). \]
Определим
\[ d=x_{k-1}-(k-1). \]
В отрезке от \(0\) до \(x_{k-1}\) находится \(x_{k-1}+1\) позиций и \(k\) открытых карт. Поэтому \(d\) — количество свободных позиций среди них.
Теперь найдём последний индекс, в котором чётность отличается от чётности крайней правой координаты:
\[ j = \max\{i<k-1:x_i\not\equiv x_{k-1}\pmod 2\}. \]
Если такого индекса нет, положим \(h=+\infty\). Иначе положим
\[ h=x_{k-1}-x_j. \]
Поскольку \(x_j\) и \(x_{k-1}\) имеют разную чётность, конечное \(h\) всегда нечётно.
Для непустой позиции её число Гранди равно
\[ \boxed{ g(X) = \max \left\{ q\ge0: q\le d,\; q\le h,\; q\equiv d\pmod2 \right\}. } \]
Для пустой позиции
\[ g(\varnothing)=0. \]
Если все \(x_i\) имеют ту же чётность, что и \(x_{k-1}\), то \(h=+\infty\) и формула упрощается:
\[ g(X)=d=x_{k-1}-(k-1). \]
Если координата противоположной чётности существует, то \(h\) ограничивает возможный нимбер, но ограничение
\[ g(X)\le d \]
сохраняется. Его нельзя выбрасывать.
Например, для
\[ X=(0,1,3) \]
получаем
\[ d=3-2=1,\qquad j=0,\qquad h=3. \]
Следовательно,
\[ g(X)=1. \]
Если оставить только условие \(g\le h\) и условие на чётность, можно ошибочно получить \(3\). Именно такой тип позиции показывает, почему ранняя краткая формулировка из обсуждения задачи нуждается в дополнительной границе \(g\le d\).
Для комбинаторного подсчёта удобнее вернуться к обычному порядку карт.
Пусть среди активных карт минимальная открытая карта имеет значение \(a\). Обозначим через \(d\) число неоткрытых карт в интервале
\[ \{a,a+1,\ldots,m\}, \]
где \(m\) — текущее число активных карт. Сама карта \(a\) открыта, поэтому эквивалентно можно считать пропуски только выше неё.
Пусть
\[ h = \min\{r\ge1:r\text{ нечётно и }a+r\text{ открыта}\}, \]
а при отсутствии такой карты \(h=+\infty\).
Тогда
\[ g = \max \left\{ q\ge0: q\le d,\; q\le h,\; q\equiv d\pmod2 \right\}. \]
Эквивалентная формулировка не использует \(h\):
\[ \boxed{ g = \max \left\{ q: 0\le q\le d,\; q\equiv d\pmod2,\; \{a+r:1\le r<q,\ r\text{ нечётно}\} \cap V =\varnothing \right\}, } \]
где \(V\) — множество открытых карт.
Иными словами, возможные кандидаты имеют ту же чётность, что и число пропусков \(d\). Кандидат \(q\) допустим, пока среди нечётных смещений
\[ 1,3,5,\ldots,q-1 \]
не встретилась открытая карта.
Доказательство проводится индукцией по числу активных карт. После каждого хода оно уменьшается, поэтому все позиции-потомки меньше исходной в параметре индукции.
Рассмотрим позицию с минимальной открытой картой \(a\), числом пропусков \(d\) и первым нечётным открытым смещением \(h\).
Если игрок накрывает открытую карту \(y>a\), минимальная открытая карта остаётся равной \(a\). Одна отсутствовавшая карта становится открытой, а накрытая карта удаляется из активного порядка. Поэтому
\[ d'=d-1. \]
Чётность числа пропусков меняется. Такие ходы создают потомков с нимберами чётности, противоположной \(d\).
Если игрок накрывает минимальную открытую карту \(a\), пусть \(b\) — новая минимальная открытая карта до перенумерации, а
\[ t=b-a. \]
Карты между \(a\) и \(b\) больше не влияют на игру, и после перенумерации
\[ d'=d-t. \]
Эти ходы позволяют переходить между кандидатами той же чётности, пропуская начальный участок позиции.
Остаётся проследить, когда такая последовательность переходов блокируется. До первого открытого нечётного смещения \(h\) все нечётные места свободны. Поэтому для каждого
\[ 0\le r<g(X) \]
можно выбрать ход одного из двух описанных типов так, чтобы у потомка выполнялось
\[ g(X')=r. \]
Чётность \(r\), отличная от чётности \(d\), достигается ходом, не меняющим минимум \(a\); совпадающая чётность достигается ходом из минимальной карты. При движении вправо по возможным значениям эта конструкция заканчивается ровно в одной из двух точек:
Поэтому верхний достижимый кандидат ограничен одновременно числами \(d\) и \(h\).
Обратное утверждение проверяется теми же двумя типами ходов. Ход выше минимума меняет чётность \(d\), а ход из минимума либо уменьшает допустимую границу, либо переносит первый нечётный блокирующий элемент левее. Ни один ход не оставляет потомку одновременно:
\[ q\equiv d\pmod2,\qquad q\le d,\qquad q\le h \]
при \(q=g(X)\).
Следовательно,
\[ \{0,1,\ldots,g(X)-1\} \subseteq \{g(X'):X\to X'\}, \]
но
\[ g(X)\notin\{g(X'):X\to X'\}. \]
По определению минимального исключённого значения это и означает
\[ g(X) = \operatorname{mex}\{g(X'):X\to X'\}. \]
Содержательно формула говорит следующее: почти весь нимбер определяется числом свободных мест \(d\), а первая открытая карта на нечётном расстоянии от минимума может преждевременно оборвать последовательность достижимых значений.
На небольшой колоде этот переход удобно проверить напрямую. Можно выбрать открытые карты, посмотреть канонические координаты и нимберы всех допустимых потомков. Следующие вкладки показывают, как частоты нимберов объединяются XOR-свёрткой и проходят через преобразование Уолша—Адамара.
Обозначим через
\[ F_N(v) \]
число подмножеств карт одной масти из \(N\) карт, имеющих число Гранди \(v\).
Всего подмножеств \(2^N\), поэтому обязательна контрольная сумма
\[ \sum_{v\ge0}F_N(v)=2^N. \]
Максимально возможный нимбер равен \(N-1\), следовательно,
\[ F_N(v)=0 \qquad\text{при }v\ge N. \]
Рассмотрим непустое начальное подмножество. Пусть \(a\) — его минимальная карта и
\[ L=N-a \]
— число карт выше неё.
Каждое такое подмножество однозначно задаётся множеством отсутствующих смещений
\[ H\subseteq\{1,2,\ldots,L\}. \]
Положим
\[ d=|H|. \]
По классификации из предыдущего раздела нимбер зависит от:
Это превращает задачу из анализа дерева игры в обычный подсчёт подмножеств.
Сначала рассмотрим \(v=0\).
Пустое начальное подмножество даёт одну проигрышную позицию.
Для непустого подмножества нимбер равен нулю в двух случаях.
Если
\[ d=0, \]
то вместе с минимальной картой \(a\) открыты все карты от \(a\) до \(N\). Для каждого \(a\) существует ровно одно такое подмножество. Всего их \(N\).
Если \(d\ge2\) чётно, следующий кандидат после нуля равен \(2\). Чтобы он был заблокирован, карта \(a+1\) должна быть открыта.
После фиксации \(a\) и \(d\) отсутствующие карты выбираются среди остальных \(L-1\) смещений:
\[ \binom{L-1}{d}. \]
Поэтому при \(N\ge2\)
\[ F_N(0) = 1+N + \sum_{\substack{d\ge2\\d\text{ чётно}}} \sum_{L=d}^{N-1} \binom{L-1}{d}. \]
Используем «клюшечную» биномиальную формулу
\[ \sum_{L=d}^{N-1}\binom{L-1}{d} = \binom{N-1}{d+1}. \]
Тогда
\[ F_N(0) = 1+N + \sum_{\substack{j\ge3\\j\text{ нечётно}}} \binom{N-1}{j}. \]
Сумма биномиальных коэффициентов с нечётными индексами равна половине полной суммы строки:
\[ \sum_{\substack{j\ge0\\j\text{ нечётно}}} \binom{N-1}{j} = 2^{N-2}. \]
Из неё нужно удалить член
\[ \binom{N-1}{1}=N-1. \]
В результате
\[ \boxed{ F_N(0)=2^{N-2}+2 } \qquad(N\ge2). \]
При \(N=1\) оба подмножества — пустое и состоящее из единственной карты — терминальны, поэтому
\[ F_1(0)=2. \]
Для \(k\ge1\) отдельно выпишем чётные и нечётные значения.
Чтобы нимбер был равен \(2k\), необходимо:
\(d\) чётно;
\(d\ge2k\);
смещения
\[ 1,3,\ldots,2k-1 \]
отсутствуют, то есть входят в \(H\);
если \(d>2k\), то смещение \(2k+1\) должно присутствовать среди открытых карт, иначе был бы допустим следующий кандидат \(2k+2\).
Первые \(k\) нечётных смещений принудительно отсутствуют.
Если \(d=2k\), остаётся выбрать ещё \(k\) отсутствующих смещений среди \(L-k\) свободно выбираемых мест:
\[ \binom{L-k}{k}. \]
Если \(d\ge2k+2\), смещение \(2k+1\) принудительно открыто. После учёта \(k\) принудительных пропусков и одной принудительно открытой позиции остаётся
\[ \binom{L-k-1}{d-k} \]
вариантов.
Суммирование сначала по \(L\), затем по допустимым \(d\), даёт удобную форму. Положим
\[ R=N-k-2. \]
После применения клюшечной формулы получаем
\[ F_N(2k) = \binom{R+2}{k+1} + \sum_{\substack{q=k+2\\q\equiv k\pmod2}}^R \binom{R+1}{q+1}. \]
Заменим \(j=q+1\):
\[ F_N(2k) = \binom{R+2}{k+1} + \sum_{\substack{j=k+3\\j\equiv k+1\pmod2}}^{R+1} \binom{R+1}{j}. \]
Сумма коэффициентов заданной чётности в строке \(R+1\) равна \(2^R\). Поэтому
\[ F_N(2k) = 2^R + \binom{R+2}{k+1} - \sum_{\substack{0\le j\le k+1\\j\equiv k+1\pmod2}} \binom{R+1}{j}. \]
По формуле Паскаля
\[ \binom{R+1}{j} = \binom{R}{j} + \binom{R}{j-1}. \]
В последней сумме первый член покрывает индексы одной чётности, второй — индексы другой. Вместе они покрывают все индексы от \(0\) до \(k+1\) ровно по одному разу:
\[ \sum_{\substack{0\le j\le k+1\\j\equiv k+1\pmod2}} \binom{R+1}{j} = \sum_{i=0}^{k+1}\binom{R}{i}. \]
Кроме того,
\[ \binom{R+2}{k+1} = \binom{R}{k-1} +2\binom{R}{k} +\binom{R}{k+1}. \]
После сокращения остаётся
\[ \boxed{ F_N(2k) = 2^{N-k-2} + \binom{N-k-2}{k} - \sum_{i=0}^{k-2} \binom{N-k-2}{i}. } \]
Теперь чётность \(d\) нечётна.
Для кандидата \(2k-1\) должны отсутствовать нечётные смещения
\[ 1,3,\ldots,2k-3. \]
Их \(k-1\).
Если
\[ d=2k-1, \]
граница по числу пропусков сама останавливает рост нимбера.
Если
\[ d\ge2k+1, \]
смещение \(2k-1\) должно соответствовать открытой карте, иначе был бы допустим кандидат \(2k+1\).
Подсчёт полностью повторяет чётный случай, но теперь
\[ R=N-k-1. \]
В результате
\[ \boxed{ F_N(2k-1) = 2^{N-k-1} + \binom{N-k-1}{k} - \sum_{i=0}^{k-2} \binom{N-k-1}{i}. } \]
Для положительного нимбера \(v\) положим
\[ k=\left\lceil\frac v2\right\rceil \]
и
\[ R_v = N-k-1-\mathbf 1_{\{v\text{ чётно}\}}. \]
Тогда
\[ \boxed{ F_N(v) = 2^{R_v} + \binom{R_v}{k} - \sum_{i=0}^{k-2}\binom{R_v}{i}, \qquad v>0. } \]
Здесь используется стандартное соглашение
\[ \binom ab=0 \]
при \(b<0\) или \(b>a\), а сумма с верхней границей меньше нижней считается пустой.
Биномиальные тождества, использованные в выводе, собраны, например, в разделе 26.3 Digital Library of Mathematical Functions.
Для первых значений \(N\) распределения имеют вид:
| \(N\) | \((F_N(0),F_N(1),\ldots,F_N(N-1))\) | Сумма |
|---|---|---|
| \(1\) | \((2)\) | \(2\) |
| \(2\) | \((3,1)\) | \(4\) |
| \(3\) | \((4,3,1)\) | \(8\) |
| \(4\) | \((6,6,3,1)\) | \(16\) |
| \(5\) | \((10,11,6,4,1)\) | \(32\) |
| \(6\) | \((18,20,11,10,4,1)\) | \(64\) |
В каждой строке сумма равна \(2^N\), как и должна.
Для \(N\le12\) можно независимо:
Все четыре проверки дают одинаковые распределения.
Закрытые формулы ещё не означают быстрый алгоритм. Если для каждого \(k\) отдельно считать сумму
\[ \sum_{i=0}^{k-2}\binom{N-k-2}{i}, \]
общая сложность станет квадратичной.
Нужно использовать связь соседних биномиальных хвостов.
Определим
\[ A_k = \sum_{i=0}^{k-2} \binom{N-k-2}{i}. \]
Положим
\[ R_k=N-k-2. \]
Тогда
\[ A_k = \sum_{i=0}^{k-2}\binom{R_k}{i}. \]
Для предыдущего индекса
\[ A_{k-1} = \sum_{i=0}^{k-3}\binom{R_k+1}{i}. \]
Применим формулу Паскаля:
\[ \begin{aligned} A_{k-1} &= \sum_{i=0}^{k-3} \left( \binom{R_k}{i} + \binom{R_k}{i-1} \right)\\ &= 2\sum_{i=0}^{k-3}\binom{R_k}{i} - \binom{R_k}{k-3}. \end{aligned} \]
Так как
\[ A_k = \sum_{i=0}^{k-3}\binom{R_k}{i} + \binom{R_k}{k-2}, \]
получаем рекуррентность
\[ \boxed{ 2A_k = A_{k-1} +2\binom{N-k-2}{k-2} +\binom{N-k-2}{k-3}. } \]
Начальное значение:
\[ A_1=0. \]
Определим
\[ B_k = \sum_{i=0}^{k-2} \binom{N-k-1}{i}. \]
Снова применяя формулу Паскаля, получаем
\[ \begin{aligned} B_k &= \sum_{i=0}^{k-2} \left( \binom{N-k-2}{i} + \binom{N-k-2}{i-1} \right)\\ &= 2A_k-\binom{N-k-2}{k-2}. \end{aligned} \]
Следовательно,
\[ \boxed{ B_k = 2A_k-\binom{N-k-2}{k-2}. } \]
После обновления одного значения \(A_k\) обе частоты вычисляются за постоянное число арифметических операций:
\[ F_N(2k) = 2^{N-k-2} + \binom{N-k-2}{k} - A_k, \]
\[ F_N(2k-1) = 2^{N-k-1} + \binom{N-k-1}{k} - B_k. \]
Пусть
\[ p=1\,000\,000\,007. \]
Это простое число, а в задаче
\[ N<p. \]
Поэтому биномиальные коэффициенты можно вычислять как
\[ \binom ab \equiv a!\,(b!)^{-1}\,((a-b)!)^{-1} \pmod p. \]
Факториалы и обратные факториалы предварительно считаются за \(O(N)\) времени. Деление на \(2\) в рекуррентности для \(A_k\) заменяется умножением на
\[ 2^{-1}\equiv\frac{p+1}{2}\pmod p. \]
Степени двойки также обновляются за \(O(1)\):
\[ 2^{r-1}\equiv2^r\cdot2^{-1}\pmod p. \]
В результате весь массив
\[ f_v=F_N(v), \qquad 0\le v<N, \]
строится за \(O(N)\) времени.
Пусть
\[ f=(f_0,f_1,\ldots) \]
— распределение нимберов одной масти.
Для двух мастей число пар с общей ним-суммой \(z\) равно
\[ (f*_{\oplus}f)_z = \sum_{x\oplus y=z}f_xf_y. \]
Операция \(*_{\oplus}\) называется XOR-свёрткой.
Для \(s\) мастей требуется \(s\)-я XOR-свёрточная степень:
\[ f^{*_{\oplus}s}. \]
Искомое число проигрышных начальных наборов — её нулевая компонента:
\[ C(N,s) = \left(f^{*_{\oplus}s}\right)_0. \]
Прямое вычисление одной XOR-свёртки требует квадратичного времени. При \(N=10^7\) это неприемлемо.
Выберем
\[ L=2^\ell\ge N \]
— минимальную степень двойки, не меньшую \(N\).
Массив частот дополняется нулями:
\[ f_v=0, \qquad N\le v<L. \]
Индексы от \(0\) до \(L-1\) рассматриваются как элементы группы
\[ (\mathbb Z/2\mathbb Z)^\ell. \]
Групповая операция в ней — побитовый XOR.
Для индексов \(t\) и \(x\) определим
\[ \chi_t(x) = (-1)^{\operatorname{popcount}(t\mathbin{\&}x)}. \]
Здесь \(\operatorname{popcount}\) — число единичных битов.
Преобразование Уолша—Адамара задаётся формулой
\[ \widehat f(t) = \sum_{x=0}^{L-1} f(x)\chi_t(x). \]
Это дискретное преобразование Фурье на булевой группе. Его матрица состоит только из \(1\) и \(-1\) и удовлетворяет
\[ H_L^2=L I. \]
Следовательно, обратное преобразование имеет вид
\[ f = L^{-1}H_L\widehat f. \]
Подробнее определение и рекурсивное устройство матрицы приведены в статье о преобразовании Адамара.
Пусть
\[ c=a*_{\oplus}b. \]
Тогда
\[ c(z) = \sum_{x\oplus y=z}a(x)b(y). \]
Преобразуем:
\[ \begin{aligned} \widehat c(t) &= \sum_z c(z)\chi_t(z)\\ &= \sum_x\sum_y a(x)b(y)\chi_t(x\oplus y). \end{aligned} \]
Для характеров булевой группы
\[ \chi_t(x\oplus y) = \chi_t(x)\chi_t(y). \]
Поэтому
\[ \begin{aligned} \widehat c(t) &= \left(\sum_xa(x)\chi_t(x)\right) \left(\sum_yb(y)\chi_t(y)\right)\\ &= \widehat a(t)\widehat b(t). \end{aligned} \]
Значит,
\[ \widehat{f^{*_{\oplus}s}}(t) = \widehat f(t)^s. \]
Полное обратное преобразование выполнять не требуется. Для \(x=0\)
\[ \chi_t(0)=1 \]
при любом \(t\). Поэтому
\[ \boxed{ C(N,s) \equiv L^{-1} \sum_{t=0}^{L-1} \widehat f(t)^s \pmod p. } \]
Это окончательная вычислительная формула.
Она особенно удобна потому, что после прямого преобразования достаточно:
Обратный проход преобразования не нужен.
Рекурсивная структура матрицы Адамара использует блок
\[ \begin{pmatrix} 1&1\\ 1&-1 \end{pmatrix}. \]
На каждом уровне пары значений
\[ (u,v) \]
заменяются на
\[ (u+v,u-v). \]
Всего уровней \(\ell=\log_2L\), на каждом обрабатываются \(L\) элементов. Поэтому сложность равна
\[ O(L\log L), \]
а дополнительная память сверх самого массива может быть постоянной.
Все сложения и вычитания выполняются по модулю \(p\). Отрицательные остатки нужно нормализовать в диапазон
\[ 0,1,\ldots,p-1. \]
Вычислительная схема выглядит так.
Построить частоты \(F_N(v)\) для \(0\le v<N\).
Проверить контрольную сумму
\[ \sum_{v=0}^{N-1}F_N(v)\equiv2^N\pmod p. \]
Выбрать минимальную степень двойки \(L\ge N\).
Дополнить массив частот нулями до длины \(L\).
Выполнить прямое быстрое преобразование Уолша—Адамара.
Для каждого преобразованного коэффициента вычислить
\[ \widehat f(t)^s\bmod p. \]
Сложить степени и умножить сумму на
\[ L^{-1}\bmod p. \]
Полученное значение является \(C(N,s)\bmod p\).
Построение распределения одной масти занимает
\[ O(N) \]
арифметических операций.
Преобразование Уолша—Адамара занимает
\[ O(L\log L). \]
Возведение всех коэффициентов в степень бинарным методом требует
\[ O(L\log s). \]
Поскольку минимальная степень двойки удовлетворяет
\[ N\le L<2N, \]
общая сложность равна
\[ \boxed{ O(N\log N+N\log s). } \]
При \(N=s\) её можно записать как
\[ O(N\log N). \]
Память определяется массивом длины \(L\) и таблицами для биномиальных коэффициентов:
\[ O(N). \]
Для одной масти из трёх карт
\[ (F_3(0),F_3(1),F_3(2)) =(4,3,1). \]
При двух мастях XOR равен нулю тогда и только тогда, когда нимберы мастей совпадают. Поэтому
\[ C(3,2) = 4^2+3^2+1^2 = 26. \]
Это совпадает с первым примером из условия.
Для \(N=13\) строится массив из тринадцати ненулевых частот, после чего он дополняется до длины
\[ L=16. \]
Четвёртая XOR-свёрточная степень, вычисленная через преобразование Уолша—Адамара, даёт опубликованный в условии остаток
\[ C(13,4)\equiv540318329\pmod{1\,000\,000\,007}. \]
Для основного случая
\[ N=s=10^7 \]
используется длина
\[ L=2^{24}=16\,777\,216. \]
Независимый расчёт прошёл следующие проверки:
Число наборов равно
\[ 2^{Ns}. \]
Даже для одной масти при \(N=10^7\) перебор невозможен.
Одного бита «выигрыш/проигрыш» недостаточно. При сложении мастей нужен полный нимбер, поскольку условие общей проигрышности имеет вид
\[ g_1\oplus\cdots\oplus g_s=0. \]
Длина партии зависит от выбора карт. Разные ходы могут закрывать возможность использования разных частей колоды, поэтому исход не определяется простой чётностью количества ещё доступных карт.
Ограничения первым нечётным блокирующим смещением недостаточно. Обязательно сохраняется граница
\[ g\le d. \]
Позиция \((0,1,3)\) является короткой проверкой этого условия.
Формула частоты содержит сумму
\[ \sum_{i=0}^{k-2}\binom{R}{i}. \]
Её повторный подсчёт для каждого \(k\) приводит к \(O(N^2)\). Линейная рекуррентность между соседними хвостами является обязательной частью решения.
Обычная свёртка соответствует сложению индексов:
\[ x+y=z. \]
Здесь индексы объединяются операцией
\[ x\oplus y=z. \]
Поэтому обычное дискретное преобразование Фурье не диагонализует нужную операцию. Требуется преобразование Фурье на булевой группе, то есть преобразование Уолша—Адамара.
Нимберы лежат в диапазоне \(0,\ldots,N-1\), но XOR двух таких чисел может иметь индекс, не меньший \(N\). Пространство индексов должно быть замкнуто относительно XOR. Поэтому длина массива выбирается равной степени двойки \(L\ge N\).
Задаче нужна только компонента с индексом \(0\). Для неё все характеры равны единице, поэтому достаточно усреднить возведённые в степень преобразованные коэффициенты. Обратное преобразование целого массива добавило бы ещё один проход \(O(L\log L)\) без пользы.
Основная цепочка преобразований выглядит так:
\[ \text{карточная игра} \longrightarrow \text{независимые масти} \longrightarrow \text{числа Шпрага—Гранди} \longrightarrow \text{биномиальное распределение одной масти} \longrightarrow \text{XOR-свёртка} \longrightarrow \text{преобразование Уолша—Адамара}. \]
Ключевой результат для одной масти — точная частота каждого положительного нимбера:
\[ F_N(v) = 2^{R_v} + \binom{R_v}{\lceil v/2\rceil} - \sum_{i=0}^{\lceil v/2\rceil-2} \binom{R_v}{i}, \]
где
\[ R_v = N-\left\lceil\frac v2\right\rceil-1 -\mathbf 1_{\{v\text{ чётно}\}}. \]
Для нулевого нимбера
\[ F_N(0)=2^{N-2}+2 \qquad(N\ge2). \]
После построения частот число проигрышных наборов для \(s\) мастей выражается одной формулой:
\[ C(N,s) \equiv L^{-1} \sum_{t=0}^{L-1} \widehat f(t)^s \pmod{1\,000\,000\,007}. \]
Таким образом, задача с астрономическим числом начальных состояний сводится к линейному построению массива и одному преобразованию размера ближайшей степени двойки.