先构造出BST 然后在上面进行统计即可 统计方法为
左子树方案数 * 右子树方案数 * C(当前位置为根节点总数, 左子树为根节点总数)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<deque>
#include<iostream>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 1000;
const int p = 1000003;
int C[MAXN+10][MAXN+10];
void init()
{
C[0][0] = 1;
for(int i = 1; i <= MAXN; i++)
{
C[i][0] = 1;
for(int j = 1; j <= i; j++) C[i][j] = (C[i-1][j-1] + C[i-1][j]) % p;
}
}
struct Binary_Search_Tree
{
int ch[MAXN+10][2], sz[MAXN+10], val[MAXN+10], ncnt, root;
void init() { memset(ch, -1, sizeof(ch)); memset(sz, 0, sizeof(sz)); ncnt = 0; root = -1; }
inline int SZ(int u) { if(u == -1) return 0; else return sz[u]; }
inline void Update(int x) {
sz[x] = SZ(ch[x][0]) + SZ(ch[x][1]) + 1;
}
void insert(int x, int u, int fa)
{
if(u == -1) {
u = ++ncnt;
sz[u] = 1; val[u] = x;
if(root == -1) root = u;
else ch[fa][x > val[fa]] = u;
return ;
}
else {
insert(x, ch[u][x > val[u]], u);
Update(u);
}
}
void insert(int x) { insert(x, root, -1); }
int dfs(int u)
{
if(u == -1) return 1;
int ans = ((LL)dfs(ch[u][0]) * dfs(ch[u][1])) % p;
ans = ((LL) ans *
C[SZ(ch[u][0])+SZ(ch[u][1])][SZ(ch[u][0])]) % p;
return ans;
}
}BST;
int main()
{
init();
int kase, T; SF("%d", &T);
for(kase = 1; kase <= T; kase++) {
int n, m;
SF("%d%d", &n, &m);
BST.init();
for(int i = 1; i <= n; i++) {
int t; SF("%d", &t); BST.insert(t);
}
int ans = BST.dfs(BST.root);
ans = ((LL) ans * C[m][n]) % p;
PF("%d\n", ans);
}
}