Песнь Нити

Автор задачи и разработчик: Павел Скобелин

Зафиксируем насекомое, которое будет Певчим, то есть переберем его из $$$n$$$ вариантов.

Поймем, как звук будет доходить до точки $$$(0, 0)$$$. Очевидно, первый клич, дошедший до $$$(0, 0)$$$, должен быть кличем от Певчего насекомого (кратчайшее расстояние между двумя точками — по прямой между ними). Так как по условию он должен быть единственным, то несложно понять, что для выполнения такого на отрезке от Певчей до Слушателя не должно находиться насекомых Эхо (если такие есть, то выкинем их из рассмотрения).

Как следующие кличи будут доходить до Слушателя? Несложно понять, что они будут иметь траекторию: Певчая $$$\rightarrow$$$ Эхо $$$\rightarrow$$$ Слушатель. Тогда для каждого насекомого посчитаем сумму расстояний от него до Слушателя и Певчей, и отсортируем по этому параметру. Далее сгруппируем кличи, которые приходят в один момент, и получим количества кличей, которые приходят в разные моменты (также нужно быть аккуратным с точностью нецелых чисел).

Далее мы получили порции кличей, которые приходят к нам в какие-то моменты — пусть это $$$x_1, x_2, \dots x_m$$$. Теперь, из них нам нужно выбрать такие $$$s-1$$$ насекомых, чтобы размеры их групп были $$$c_2, c_3, \dots c_k$$$. Это можно сделать с помощью динамического программирования: $$$\mathtt{dp}_{i, j}$$$ — количество способов выбрать первые $$$j$$$ кличей из первых $$$i$$$ моментов времени. Пересчет будет выглядеть так: $$$$$$\mathtt{dp}_{i, j} = \mathtt{dp}_{i-1, j} + \mathtt{dp}_{i-1, j-1} \cdot C_{x_i}^{c_j} \text{.}$$$$$$

Так как каждый раз мы можем или не брать текущий $$$x_i$$$ в рассмотрение, или выбрать из него $$$c_i$$$ насекомых, не учитывая порядок, с помощью числа сочетаний. Ответ ДП будет лежать в $$$\mathtt{dp}_{n, k}$$$.

Таким образом, мы можем посчитать ДП за $$$\mathcal{O}(n k)$$$. С учетом перебора Певчего насекомого, решение будет работать за $$$\mathcal{O}(n^2 k)$$$.