# Разбор контеста "Худшие сборы 3: теория игр и чисел" > Дорешка по разбору - самое важное в СП. Если вы не дорешиваете, вы ничему не учитесь. :::warning Совет: не лезьте в разбор сразу же. В идеале, подумайте над задачей где-то 20-30 минут, и только потом читайте разбор. ::: # [G.RETRO. Новая игра](https://codeforces.com/gym/501344/problem/G.RETRO) :::spoiler Подсказка 1 :::info Сделаем граф, в котором вершины - клетки нашей матрицы. Соответственно, из каждой вершины этого графа будут выходить не более двух направленных рёбер. ::: :::spoiler Подсказка 2 :::info Вы, возможно, будете в шоке, но для этого графа нужно применить метод ретроспективного анализа. ::: :::spoiler Разбор :::info Сделаем граф, в котором вершины - клетки нашей матрицы. Соответственно, из каждой вершины этого графа будут выходить не более двух направленных рёбер. Затем, применим метод ретроспективного анализа и найдём состояние для текущей вершины и первого игрока. Если состояние выигрышное - выиграл Антон, если проигрышное - выиграл Яша, а иначе между игроками будет ничья. Асимптотика - $O(N \cdot M)$. ::: # [G1. Жадина-говядина](https://codeforces.com/gym/501344/problem/G1) :::spoiler Подсказка :::info Какая стратегия есть у первого и второго игрока? ::: :::spoiler Разбор :::info Если $n$ даёт при делении на $k+1$ остаток 1, то у второго игрока есть стратегия для выигрыша. Если первый игрок берёт на очередном ходу $x$ конфет, второй возьмёт $k+1-x$ конфет (он всегда может это сделать). Как только в кучке останется одна конфета, её возьмёт первый игрок и проиграет. Если $n$ не даёт при делении на $k+1$ остаток 1, первый игрок своим ходом всегда может свести игру к остатку 1, и соответственно, он выиграет. Асимптотика: $O(1)$ для каждого тестового случая. ::: # [G2. Шоколадка Г2](https://codeforces.com/gym/501344/problem/G2) :::spoiler Подсказка :::info В этой задаче используется теорема Шпрага-Гранди. Пусть $g[i][j]$ - число Гранди для матрицы размера $(n, m)$. ::: :::spoiler Разбор :::info В этой задаче используется теорема Шпрага-Гранди. Пусть $g[i][j]$ - число Гранди для матрицы размера $(n, m)$. Тогда, если в матрице один ряд/столбец и всего не более $S$ клеток, то $g[i][j]$ = 0, и позиция проигрышная. Иначе, $g[i][j]$ равно MEX среди всех значений ($g[k][j]$ ^ $g[i - k][j]$) ($1 \le k < i$) и ($g[i][k]$ ^ $g[i][j - k]$) ($1 \le k < j$). Асимптотика - $O(N \cdot M \cdot (N + M))$. ::: # [G3. Смак](https://codeforces.com/gym/501344/problem/G3) :::spoiler Подсказка 1 :::info Воспользуемся функцией Гранди. ::: :::spoiler Подсказка 2 :::info Заметим закономерность в функции Гранди. ::: :::spoiler Разбор :::info Пусть $g_i$ - функция Гранди для числа $i$. Тогда $g_i$ равен MEX из $g_{i-1}$ и $g_{\varphi(i)}$. Посмотрим на значения $g_i$. Первые 20 значений: 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0. Несложно заметить, что после первых четырёх чисел мы видим период $(1, 0)$. Значит, при $n > 4$ Ургант побеждает при чётном $n$, а при нечётном - Сафонов, при этом Ургант побеждает с помощью первой операции. Случаи с $n \le 4$ проверим вручную. Асимптотика: $O(1)$. ::: # [G4. Деление кучки](https://codeforces.com/gym/501344/problem/G4) :::spoiler Подсказка 1 :::info Воспользуемся функцией Гранди. ::: :::spoiler Подсказка 2 :::info Будем рекурсивно решать задачу для числа $n$. ::: :::spoiler Подсказка 3 :::info Выражение $a$ ^ $a$ ^ $a$ ^ $a$ ... ^ $a$ равно 0 или $a$ в зависимости от чётности количества чисел в нём. ::: :::spoiler Разбор :::info Пусть $g_x$ - функция Гранди для числа $x$. Тогда $g_x$ равен MEX из $g_{x / a_i}$ ^ $g_{x / a_i}$ ^ $g_{x / a_i}$ ^ ... (всего в выражении $a_i$ чисел; $x$ должно нацело делиться на $a_i$). Заметим, что если $a_i$ чётное, то выражение равно 0, а иначе оно равно $g_{x / a_i}$. Значит, для числа $n$ достаточно знать значение $x / a_i$. Будем решать задачу рекурсивно, найдя для текущего $x$ значение $g_x$. Рекурсия считает функцию Гранди только для делителей $n$ (их не более $\sqrt[3]{n}$), проверяя каждое из чисел в массиве $a$. Асимптотика: $O(\sqrt[3]{n} \cdot m)$. ::: # [G5. Раскраска графа](https://codeforces.com/gym/501344/problem/G5) :::spoiler Подсказка 1 :::info Пусть $g[i][x1][x2]$ - функция Гранди для цепочки из $i$ вершин, где $x1$ и $x2$ - значения слева и справа от цепочки. ::: :::spoiler Подсказка 2 :::info Заметим закономерность в функции Гранди. ::: :::spoiler Разбор :::info Пусть $g[i][x1][x2]$ - функция Гранди для цепочки из $i$ вершин, где $x1$ и $x2$ - значения слева и справа от цепочки. Тогда, $g[i][x1][x2]$ равно MEX среди всех значений $g[pos - 1][x1][cur]$ ^ $g[i - pos][cur][x2]$, где $pos$ - позиция вершины, которую мы красим, а $cur$ - цвет покрашенной вершины. Посмотрим, как выглядит функция Гранди. $\textbf{Числа Гранди в виде матрицы 3х3:}$ Длина цепочки равна 1: 1 1 1 1 1 0 1 0 1 Длина цепочки равна 2: 0 2 2 2 1 0 2 0 1 Длина цепочки равна 3: 1 3 3 3 1 0 3 0 1 Длина цепочки равна 4: 0 4 4 4 1 0 4 0 1 Длина цепочки равна 5: 1 5 5 5 1 0 5 0 1 $\textbf{Длина цепочки равна sz:}$ $sz$%$2$ $sz$ $sz$ $sz$ $sz$%$2$ $0$ $sz$ $0$ $sz$%$2$ Тогда во введённой строке найдём все цепочки из вершин и цвета их соседей, и обновим итоговую функцию Гранди. Асимптотика: $O(N)$. ::: # [G6. poppin' bottles in the ice, like a blizzard](https://codeforces.com/gym/501344/problem/G6) :::spoiler Подсказка 1 :::info Пусть $g_i$ - функция Гранди для вершины $i$. К сожалению, $g_i$ не равно MEX всех её детей, так как мы не учитываем ребро от текущей вершины до ребёнка. ::: :::spoiler Подсказка 2 :::info Дерево со значением $g_i=x$ эквивалентно бамбуку с $x$ рёбрами. ::: :::spoiler Поиск ответа :::info Пусть $g_i$ - функция Гранди для вершины $i$. К сожалению, $g_i$ не равно MEX всех функций Гранди её детей, так как мы не учитываем ребро от текущей вершины до ребёнка. Заметим, что дерево со значением $g_i=x$ эквивалентно бамбуку с $x$ рёбрами. Тогда, добавляя одно ребро к началу нашего потомка, мы по сути добавим одно ребро к бамбуку (добавим один камень к кучке в ниме). Значит, $g_i$ равно MEX среди всех значений $g_{to}+1$, где $to$ - потомок вершины $i$. Асимптотика: $O(n)$. Разбор этой задачи без восстановления вершины: https://youtu.be/qkKunQ-ifPA?t=11941 ::: :::spoiler Восстановление вершины :::info Итак, нам нужно найти вершину, удалив поддерево которй мы получим значение $g_r=0$. Будем решать задачу рекурсивно. Изначально мы находимся в вершине $r$ и хотим, что в ней было число 0. Пусть мы решаем задачу для вершины $v$ и хотим, чтобы в ней было число $x$. Тогда, давайте рекурсивно спустимся во всех её детей ($to$ - текущий ребёнок), передав некоторое значение $val$. Чтобы найти это значение, сначала удалим из $dp_v$ старое значение $dp_{to}+1$ ($dp_v$ станет равным $dp_v$ ^ $(dp_{to}+1)$). Мы же хотим, чтобы итоговое значение в вершине $v$ было равно $x$, поэтому новое значение $dp_{to}+1$ будет равно $dp_v$ ^ $(dp_{to}+1)$ ^ $x$. Значит, $val$ = $dp_v$ ^ $(dp_{to}+1)$ ^ $x$ - 1. Если для вершины $v$ значение $val = -1$, то этой вершины в дереве быть не должно. Тогда уладим эту вершину, обрубив ребро этой вершины с её предком. Асимптотика: $O(n)$. ::: # [G7. Дельта альфа альфа штрих](https://codeforces.com/gym/501344/problem/G7) :::spoiler Разбор :::info Пусть $g_i$ - функция Гранди для вершины $i$. Тогда, при подсчёте всех значений мы получим асимптотику $O(2^n)$. Это много. Для оптимизации воспользуемся Альфа-Бета отсечением. Разбор этой задачи с объяснением Альфа-Бета отсечения: https://youtu.be/qkKunQ-ifPA?t=14239 ::: # [N1. Включаем, исключаем, фиксируем прибыль](https://codeforces.com/gym/501344/problem/N1) :::spoiler Подсказка :::info Зачем при подсчёте ответа рассматривать все числа от 2 до $K$? ::: :::spoiler Разбор :::info Заметим, что при проверке числа на то, что оно не делится на числа на отрезке от 2 до $K$, достаточно проверять только простые числа. Таких чисел на отрезке от 2 до 30 всего 10: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29. Осталось решить задачу только для простых чисел от 2 до $K$. Воспользуемся методом включений-исключений. Пусть во множестве простых чисел мы взяли какое-то подмножество размера $sz$ с произведением $pr$. Тогда нужно прибавить к ответу $(-1)^{sz} \cdot pr$. Асимптотика: $O(2^{Kprimes} \cdot Kprimes)$ для одного тестового запроса, где $Kprimes$ - кол-во простых от 2 до $K$. ::: # [N2. Разноцветные маркеры](https://codeforces.com/gym/501344/problem/N2) :::spoiler Подсказка 1 :::info $a + b$ - количество клеток в большом прямоугольнике. Переберём меньшую сторону этого прямоугольника среди делителей $a + b$. ::: :::spoiler Подсказка 2 :::info Пусть меньшая сторона большого прямоугольника равна $w$ и красные клетки будут образовывать прямоугольник в левом верхнем углу. Как проверить, что такой прямоугольник существует? ::: :::spoiler Разбор :::info $a + b$ - количество клеток в большом прямоугольнике. Переберём меньшую сторону этого прямоугольника среди делителей $a + b$. Пусть меньшая сторона большого прямоугольника равна $w$ и красные клетки будут образовывать прямоугольник в левом верхнем углу. Тогда стороны этого прямоугольника будут делителями $a$. При этом, сторона, параллельная меньшей стороне большого прямоугольника, будет не более $w$. Чем больше одна сторона красного прямоугольника, тем меньше другая (т.к. его площадь фиксирована). Тогда, найдём в списке делителей наибольший (пусть он равен $del$), меньший, чем $w$, с помощью бинарного поиска и проверим, вмещается ли вторая сторона красного прямоугольника в большой прямоугольник ($\frac{a}{del} \le \frac{a+b}{w}$). Если да, обновим ответ для задачи. Аналогичную проверку делаем и с синим прямоугольником. Асимптотика: $O(\sqrt[3]{a + b} \cdot (log(\sqrt[3]{a}) + log(\sqrt[3]{b})))$. Оригинальный разбор: https://codeforces.com/blog/entry/61439 ::: # [N3. Футбольный сезон](https://codeforces.com/gym/501344/problem/N3) :::spoiler Подсказка :::info $d$ побед дают такое же количество очков, как и $w$ ничьих. ::: :::spoiler Разбор :::info $d$ побед дают такое же количество очков, как и $w$ ничьих. Так как проигрыши дают 0 очков и их можно использовать сколько угодно раз, то нам выгодно набирать как можно больше очков за один матч. Значит, $d$ побед выгоднее, чем $w$ ничьих, и тогда можно просто брать $d$ побед, пока нам позволяют это очки и матчи. Проще говоря, возьмём $\frac{n}{d \cdot w}$ раз по $d$ побед. Теперь осталось добрать оставшиеся очки. Переберём $ost$ - остаток от деления количества побед на $d$. Тогда количество ничей - $\frac{ostpoints - ost * w}{d}$, где $ostpoints$ - оставшиемся очки. Если ответ получился нецелый, то для текущего нет решения. Если частное меньше нуля, можно откатить $d$ побед и добавить $w$ к количеству ничей (если у нас есть хотя бы $d$ побед). В итоге мы получаем количество побед и ничей, и если их сумма не более $n$, добиваем количество матчей до $n$ с помощью проигрышей, а иначе для текущего остатка решения не существует. Асимптотика: $O(d)$. Оригинальный разбор: https://codeforces.com/blog/entry/70553 ::: # [N4. Кто не будет решать математику - пойдёт красить забор](https://codeforces.com/gym/501344/problem/N4) :::spoiler Подсказка 1 :::info Пусть $a + b$ равно некому $k$. Тогда строка должна иметь период $k$. Если это так, то максимальная позиция единицы во всех блоках (по модулю $k$) должна быть меньше минимальной позиции нуля (по модулю $k$) во всех блоках. Это условие не только достаточное, но и необходимое. ::: :::spoiler Подсказка 2 :::info В задаче применяется гармонический ряд. ::: :::spoiler Разбор :::info Пусть $a + b$ равно некому $k$. Тогда строка должна иметь период $k$. Если это так, то максимальная позиция единицы во всех блоках (по модулю $k$) должна быть меньше минимальной позиции нуля во всех блоках (по модулю $k$). Это условие не только достаточное, но и необходимое. Будем хранить две разреженные таблицы (sparse table). В одной для отрезка $(l, r)$ сохраним самый правый ноль, во второй - самую левую единицу. Найдём максимальную позицию нуля (по модулю $k$) и минимальную позицию нуля (по модулю $k$) во всех блоках. Если между этими двумя позициями есть ещё позиции, заполним их единицами, так как это не влияет на корректность и максимально увеличивает кол-во чёрных досок. В итоге мы получили префикс из нулей и суффикс из единиц. Итак, теперь мы умеем находить оптимальные $a$ и $b$ для размера блока $k$ за $O(\frac{|s|}{k})$. Давайте сделаем это для всех $k$ от 1 до $|s|$. В итоге, мы сделаем $O(\frac{|s|}{1})$ + $O(\frac{|s|}{2})$ + $O(\frac{|s|}{3})$ + ... + $O(\frac{|s|}{|s|})$ = $O(|s| \cdot log(s))$ операций. Асимптотика: $O(|s| \cdot log(s))$. ::: # [N5. Тоня и Бурёнка-179](https://codeforces.com/gym/501344/problem/N5) :::spoiler Подсказка 1 :::info Ответ для $k=x$ и $k=gcd(x,n)$ одинаков. Значит, для $k$ стоит рассматривать только делители $n$. Зная это, попробуйте решить задачу за $O(n \cdot \sqrt[3]{n} \cdot log(n))$. ::: :::spoiler Подсказка 2 :::info В этой задаче полезно общее утверждение: для любого массива $c$ длины $k$ верно $k ⋅ max(c_1,c_2,…,c_k) \ge c_1+c_2+…+c_n$. ::: :::spoiler Подсказка 3 :::info Попробуйте применить вторую подсказку для $k_1$ и $k_2$ делящимся на $k_1$, где $k_1$, $k_2$ - делители $n$. ::: :::spoiler Разбор :::info Ответ для $k=x$ и $k=gcd(x,n)$ одинаков. Значит, для $k$ стоит рассматривать только делители $n$. Сохраним список делителей $n$ в массив $del$. Пусть $sum[pos][i]$ - полезность для стартовой пары $(pos, del_i)$. Заметим при этом, что можно рассматривать только $pos \le del_i$. При обновлении числа будем проходиться по делителям $n$ и обновлять необходимые значение. Чтобы поддерживать максимальное значение в массиве $sum$, сохраним все его значения в $multiset$. В итоге, мы получаем решение за $O(n \cdot \sqrt[3]{n} \cdot log(n))$. В этой задаче полезно общее утверждение: для любого массива $c$ длины $k$ верно $k ⋅ max(c_1,c_2,…,c_k) \ge c_1+c_2+…+c_n$. Если применить это для $k_1$ и $k_2$ делящимся на $k_1$, где $k_1$, $k_2$ - делители $n$, то мы поймём, что делитель $k_2$ никак не влияет на ответ. Значит, мы можем не учитывать делители $n$, которые делятся на другой делитель $n$ (не равный $n$). Такие делители представляются в виде формулы $\frac{n}{p}$, где $p$ - простой делитель $n$. Для $n \le 2 \cdot 10^5$ различных простых делителей не более 6. Сложность этого решения - $O(n \cdot log(n) \cdot 6)$, где 6 это максимальное количество различных простых делителей числа $n$. Оригинальный разбор: https://codeforces.com/blog/entry/106049 ::: # [mem. Восстановление BST](https://codeforces.com/gym/501344/problem/mem) :::spoiler Подсказка 1 :::info Попробуйте придумать $dp[l][r]$ (возможны доп. измерения). ::: :::spoiler Подсказка 2 :::info Пусть $dp[l][r][root]$ равно 0 или 1 в зависимости от того, можно ли сделать BST для чисел на отрезке $(l, r)$ и корнем в позиции $root$. Обновляется она за линейное время, и мы получаем решение за $O(n^4)$. ::: :::spoiler Подсказка 3 :::info Пусть $edge[l][r][side]$ равно 0 или 1 в зависимости от того, можно ли сделать BST для чисел на отрезке $(l, r)$ и корнем в позиции $l$ или $r$ в зависимости от $side$ ($side$ = {0, 1}). Обновляется она также за линейное время. ::: :::spoiler Подсказка 4 :::info $dp[i][j][root] = (edge[i][root][1]$ & $edge[root][j][0])$. Значит, теперь обновление $dp$ работает за $O(1)$. ::: :::spoiler Разбор :::info Пусть $dp[l][r][root]$ равно 0 или 1 в зависимости от того, можно ли сделать BST для чисел на отрезке $(l, r)$ и корнем в позиции $root$. Обновляется она за линейное время (слева и справа должны быть вершины $lft$ и $rght$, для которых $dp[l][root - 1][lft]$ и $dp[root + 1][r][rght]$ равны 1, и при этом значения в $lft$ и $rght$ и значение в $root$ не взаимно просты), и мы получаем решение за $O(n^4)$. Оптимизируем это решение. Пусть $edge[l][r][side]$ равно 0 или 1 в зависимости от того, можно ли сделать BST для чисел на отрезке $(l, r)$ и корнем в позиции $l$ или $r$ в зависимости от $side$ ($side$ = {0, 1}). Обновляется она также за линейное время (так же, как и в $dp$). Заметим, что значение $dp[i][j][root]$ задаётся как $(edge[i][root][1]$ & $edge[root][j][0])$. Значит, теперь обновление $dp$ работает за $O(1)$. Итого, мы можем считать оба массива за $O(n^3)$. Асимптотика: $O(n^3)$. Оригинальный разбор: https://codeforces.com/blog/entry/61323 :::