Link
题意:给你一个n, k, q, n代表长度为n的数组,数组中是1~n的全排列, k是进行k次插入排序。
现在问你1~n的全排列中有多少种排列会在进行k次插入排序后其最长上升子序列长度大于等于n - 1.
进行k次插入排序含义:下标1~k的位置排序好了, k + 1 ~ n 未变。
排列组合思路:借鉴link
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e4;
int n, k, q;
int b[55];
signed main()
{
int t = 0;
scanf("%lld", &t);
b[1] = 1;
for(int e = 1; e <= t; e ++)
{
int ans = 0;
scanf("%lld%lld%lld", &n, &k, &q);
for(int i = 2; i <= n; i ++)
{
b[i] = b[i - 1] * i % q;
}
k = min(k, n);
ans = ((1 + (n - k) * (n - k - 1)) % q * b[k] + b[k] * (n - k) % q * k) % q;
printf("Case #%lld: %lld\n", e, ans);
}
}