Solução
design de Estado
Set \ (f_ {i, j} \) de \ (1 \) para \ (I \) são organizados, que \ (J \) um \ (\ text { '<' } \) do número de programas.
transição de estado
Tente de (I \) \ prossegue para o \ (i + 1 \) , a substância é considerada a \ (i + 1 \) é introduzido para que a posição da sequência.
- Se você inserir para a esquerda, irá adicionar um sinal de maior que ( \ (1 \) caso)
- Se a inserção para o direito mais, irá adicionar menos de um número ( \ (1 \) caso)
- Se você inserido entre um a menos, menos do que destruir um gerar um número menor que e maior que, maior do que o equivalente de um novo número ( \ (J \) caso)
- Se o número é maior que um entre o inserto, destruir um número maior do que, produzir um maior que e menor do que um número, menos do que o equivalente de um novo número ( \ (I -. 1 - J \) caso)
Para resumir:
- Há \ (j + 1 \) caso é maior do que o aumento de um número, isto é \ (f [i + 1] [J] \ recebe f [i] [j] * (j + 1) \)
- Há \ (i - j \) caso aumento de um número menor do que \ (f [i + 1] [j + 1] \ recebe f [i] [j] * (i - j) \)
Código
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1005, P = 2015;
int n, K, f[N][N];
int main() {
scanf("%d%d", &n, &K);
f[1][0] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
(f[i + 1][j] += f[i][j] * (j + 1)) %= P;
(f[i + 1][j + 1] += f[i][j] * (i - j)) %= P;
}
}
printf("%d\n", f[n][K]);
}