在一个排列中,一个折点是指排列中的一个元素,它同时小于两边的元素,或者同时大于两边的元素。
对于一个 1∼n 的排列,如果可以将这个排列中包含 t个折点,则它称为一个 t+1 单调序列。
例如,排列 (1,4,2,3) 是一个 3 单调序列,其中 4 和 2 都是折点。
给定 n 和 k,请问 1∼n 的所有排列中有多少个 k 单调队列?
输入格式
输入一行包含两个整数 n,k。
输出格式
输出一个整数,表示答案。
答案可能很大,你可需要输出满足条件的排列数量除以 123456 的余数即可。
数据范围
1≤k≤n≤5001≤k≤n≤500
输入样例:
4 2
输出样例:
12
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1001;
int a[N];
int n, k;void init() {for (int i = 1; i <= n; i++)a[i] = i;
}int main() {cin >> n >> k;init();int ans = 0;do {int cnt = 0;for (int i = 2; i <= n - 1; i++) {if (a[i] > a[i - 1] && a[i] > a[i + 1] ||a[i] < a[i - 1] && a[i] < a[i + 1])cnt++;}if (cnt + 1 == k)ans++;} while (next_permutation(a + 1, a + 1 + n));cout << ans%123456 << endl;return 0;
}