Кожне коло з a_i + 1 кольорів після викреслення одного кольору перетворюється на один відрізок незакреслених кольорів довжини a_i. Далі коло вже не має значення — уся задача живе на мультимножині довжин відрізків.
Що робить один крок? Береться найдовший відрізок довжини , з нього викреслюється середина, і він розпадається на два відрізки довжин
(їхня сума дорівнює L - 1, бо одна клітинка зникає). Порожні відрізки просто зникають.
Моделювати m \le 10^{18} кроків по одному неможливо. Але тут працює важливе спостереження: алгоритм завжди бере найдовший відрізок, тому всі відрізки однакової максимальної довжини будуть оброблені підряд, перш ніж черга дійде до коротших. Отже, кроки природно групуються в «раунди»: за один раунд ми обробляємо всі відрізків поточної максимальної довжини одразу.
Крім того, довжини щоразу приблизно вдвічі зменшуються, тому різних довжин у мультимножині завжди небагато — порядку \log(\max a_i), тобто кілька десятків. Тому зберігати мультимножину зручно як відсортований список пар «довжина — кількість».
Алгоритм:
беремо найбільшу довжину з кількістю ;
якщо кроків, що залишилось зробити, менше за , то саме і є відповіддю — це максимальна довжина відрізка перед потрібним вибором;
інакше віднімаємо від лічильника кроків, викидаємо зі списку і додаємо по відрізків довжин та \lfloor (L-1)/2 \rfloor (нульові пропускаємо).
Зверніть увагу, що нас цікавить стан перед вибором (m+n)-го кольору, тобто після m - 1 додаткових кроків.
Технічна порада: кількості відрізків подвоюються з кожним раундом, тому в мовах із фіксованою розрядністю вони можуть переповнити 64-бітний тип. Оскільки нас цікавить лише порівняння з числом кроків (не більшим за 10^{18}), достатньо обмежувати лічильники зверху якоюсь константою на кшталт 2 \cdot 10^{18}.