Mex Permutations#231

Mex Permutations (Editorial)

Спершу з'ясуємо, коли масив узагалі коректний. Величина від дедалі більшої множини не може спадати, тому мусить бути неспадним. Крім того, після всіх елементів множина — це \{0, 1, \ldots, n-1\}, отже F_n = n. Якщо щось із цього порушено, відповідь нульова.

Тепер розглянемо, що відбувається на кожному кроці. Нехай \mathit{last} = F_{i-1} — поточне значення перед позицією .

Крок без зростання (F_i = \mathit{last}). Значення не змінилось, отже на позицію поставили щось, що його не «розблокувало», — тобто будь-яке ще не використане число, крім самого . Ми поки не фіксуємо, яке саме: така позиція залишається «вільним слотом», і чим її заповнити, вирішиться пізніше.

Крок зі зростанням (F_i > \mathit{last}). Щоб зрушив з місця, на позицію мусить потрапити рівно число — тут вибору немає. А щоб він стрибнув аж до F_i, усі числа

\mathit{last}+1,\; \mathit{last}+2,\; \ldots,\; F_i - 1

мають уже бути присутніми серед перших елементів. Їх рівно \mathit{nums} = F_i - \mathit{last} - 1 штук.

Скільки є місць, куди їх можна було покласти? Серед перших позицій уже стоять різних чисел, серед яких обов'язково всі 0, 1, \ldots, \mathit{last}-1 (бо дорівнює ). Отже, позицій, зайнятих числами, більшими за , рівно

\mathit{spots} = i - \mathit{last},

і саме це і є ті «вільні слоти», які ми досі не заповнювали.

Тепер вибір: які саме із слотів отримають потрібні числа і в якому порядку. Це кількість розміщень

A(\mathit{spots}, \mathit{nums}) = \frac{\mathit{spots}!}{(\mathit{spots} - \mathit{nums})!}.

Відповідь — добуток цих величин по всіх кроках зі зростанням (кроки без зростання множників не дають, бо їхній вибір відкладається). Оскільки F_n = n, наприкінці всі слоти виявляються заповненими, тож жодної невизначеності не лишається.

Факторіали та обернені до них за модулем рахуємо заздалегідь, тому весь розв'язок — це один прохід за .