Цветные кирпичики

Условие задачи

Условие

Даны три числа. Полоска длины и цветов и число .

Сколько существует способов покрасить полоску, так чтобы выполнялось ровно раз.

По простому модулю

Примеры

входные данныевыходные данные

Решение

Решение

Динамика на префиксе.

  1. Состояние — количество последовательностей на префиксе где ровно раз .
  2. Начальные значения т.к. можно покрасить в любой цвет.
  3. Считаем опять двумя циклами:
  • всегда. Если брать .

  • если , т.к красим в любой из цветов без одного.

  1. Ответ — все цветов и последний префикс.

int dp[2001][2001];

void solve() {
  int n, m, k;
  cin >> n >> m >> k;

  dp[0][0] = m;
  for (int i = 1; i < n; i++) {
    dp[i][0] = dp[i - 1][0];
    for (int j = 1; j <= k; j++) {
      dp[i][j] = add(dp[i - 1][j], mult(dp[i - 1][j - 1], (m - 1)));
    }
  }
  cout << dp[n - 1][k];
}