Олимпиадный тренинг

Задача . F. Вася и массив


Задача

Темы: дп *2400

У Васи есть массив, состоящий из \(n\) чисел, а также два числа \(k\) и \(len\). Все числа массива либо лежат в отрезке от \(1\) до \(k\) (включительно), либо равны \(-1\). Массив называется хорошим, если в нем нет подотрезка длины \(len\) или более, состоящего из одинаковых чисел.

Сообщите Васе количество способов заменить все \(-1\) на числа от \(1\) до \(k\) (включительно) так, чтобы получившийся массив был хорошим. Так как количество хороших массивов может быть достаточно большим, выведите его по модулю \(998244353\).

Входные данные

В первой строке заданы три целых числа \(n, k\) и \(len\) (\(1 \le n \le 10^5, 1 \le k \le 100, 1 \le len \le n\)).

Во второй строке заданы \(n\) целых чисел — массив Васи. Каждое число либо равно \(-1\), либо лежит в отрезке от \(1\) до \(k\) (включительно).

Выходные данные

В единственной строке выведите целое число — количество способов заменить все \(-1\) на числа от \(1\) до \(k\) (включительно) так, чтобы получившийся массив был хорошим. Так как ответ может быть очень большим, выведите его по модулю \(998244353\).

Примечание

В перовом тестовом примере существует два способа:

  1. \([1, 2, 1, 1, 2]\);
  2. \([1, 2, 1, 2, 2]\).

Во втором тестовом примере не существует ни одного способа сделать массив хорошим, т. к. подотрезок с первого по второй элемент всегда будет состоять из одинаковых чисел.

В третьем тестовом примере перечислить все хорошие массивы не представляется возможным.


Примеры
Входные данныеВыходные данные
1 5 2 3
1 -1 1 -1 2
2
2 6 3 2
1 1 -1 -1 -1 -1
0
3 10 42 7
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
645711643

time 2000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя