Будем решать задачу динамикой, но для начала нам нужно понять несколько вещей:
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 пункта считать тоже какой-то формулой, но как-то сходу не получилось, и в общем недодебагали, обидно...
А можно объяснение первого sample-теста? Он у меня так и не сошелся в голове, т.е. задачу я так и не понял.
Считаем, что у нас есть 8 чисел по кругу, первое равно 0. Ответ — количество таких расстановок единиц и двоек на оставшиеся 7 мест (что отвечает двум цветам), что любые два блока (i, i+1), (i+2, i+3) отличаются не более чем в одном разряде. Вот ответ для a_1 = 1, a_2 = 1, остальные получаются инвертацией (1 -> 2, 2 -> 1) цветов на четных / нечетных позициях:
0 1 1 1 1 1 1 1
0 1 1 1 1 1 2 1
0 1 1 1 2 1 1 1
0 1 1 1 2 1 2 1
А, понял, я пофейлил то, что они по кругу стоят.
Первый тест, он непростой в плане понимания, у нас на нем к концу 5 часа решение перестало работать=) А как его в голове понять, я вообще не знаю...
Жутко не хватало пояснения к первому тесту, да.