romanandreev's blog

By romanandreev, 12 years ago, In Russian

Будем решать задачу динамикой, но для начала нам нужно понять несколько вещей:

1) Каждый подотрезкок длины M отличается от следующего не белее чем в одной позиции тогда и только тогда, когда выполнены 2 условия:

a) Разрежем наш абажур ПОСЛЕ серой лампочки, и дальше разобьем его на R = N/M кусков длины M. Тогда прошлое условие точно должно выполняться для каждого из наших R отрезков.

b) Пусть для лампочки с номером x выполняется color[x] != color[(x + m) % n] и аналогичное условие для y != x. Тогда расстояние между x и y >= m.

(Доказательство почти тривиально=) )

2) Нарисуем такую матрицу M x R, где a[i][j] будет 1, если color[i + j * M] != color[(i + j * M — m) % n]. (столбцы нумеруются слева-направо, строки снизу вверх) В каждом столбце будет не более 1 единички(это по условию a). Тогда из условия b следует, что 1 будут идти слева направо и снизу вверх(график неубывает), потом пустой столбец(возможно несколько), и опять неубывающая последовательность, итп.

3) Рассмотрим строчку с номером m — 1. Она соответствует серой лампочке и следующим после нее на расстоянии кратном m. В ней в начале должно стоять несколько единиц, то есть в начале такая горизонтальная линия идет.

4) В остальных строчках либо пусто, либо есть F единиц. Сколько способов это покрасить, чтобы в конце мы опять вернулись в нужный нам цвет? Это легко считается простейшей динамикой D[F][last_color], можно ее и значительно быстрее считать, но нам это не нужно=)

А теперь начинается самое интересное — динамика для ответа=)

Зафиксируем число пустых столбцов P.

Будем идти по строкам снизу вверх и хранить то, сколько нам нужно поставить еще 1 в эту матрицу. Понятно, что нам надо поставить R — 1 — P единиц(мы не рассматриваем 1 столбец, для него все и так получится хорошо, ведь мы в 4 пункте так специальную дп считали).

dp[rows][ones]

Чтобы ее почитать, переберем сколько 1 мы ставим в эту строку. А дальше через несложные C из n по k понимаем, сколько способов расставить наши 1 в те возрастающие последовательности между P пустыми строки.

Также тут возникает 2 случая, соответственно из пункта 3 и 4.

Ну и нам остается просуммировать по всем P соответствующие dp[M][R — 1 — P].

Вот=)

PS Возможно я где-то накосячил с понятием верх-низ или с +-1, но я думаю суть понятна.

PPS Мы сдали эту задачу в дорешивание, на контесте мы пытались динамику из 4 пункта считать тоже какой-то формулой, но как-то сходу не получилось, и в общем недодебагали, обидно...

  • Vote: I like it
  • +54
  • Vote: I do not like it