#P13969. [VKOSHP 2024] Exchange and Deletion

[VKOSHP 2024] Exchange and Deletion

Description

有一种经典的方法可以从数组中删除一个元素:将要删除的元素与数组的最后一个元素交换,然后删除最后一个元素。 不幸的是,这种方法并不总是能保持数组元素的顺序。你的任务是统计有多少种长度为 kk 的删除序列,使得初始为升序排列的数组在经过这些删除操作后仍然保持升序。

给定一个长度为 nn 的数组 aa,初始时 ai=ia_i=i,即 aa 按升序排列。还给定一个长度为 kk 的数组 bb,其中元素是 11nn 的两两不同的数。

进行 kk 步操作,在第 jj 步时,选择一个下标 ii,满足 1inj+11 \leq i \leq n-j+1ai=bja_i = b_j,然后交换 aia_ianj+1a_{n-j+1}(如果 i=nj+1i = n-j+1,则不做任何操作)。接着删除当前数组的最后一个元素(即下标为 nj+1n-j+1 的元素)。

如果在 kk 步操作后,数组 [a1,a2,,ank][a_1,a_2,\ldots,a_{n-k}] 仍然严格递增,则称数组 [b1,b2,,bk][b_1,b_2,\ldots,b_k] 是“好”的。

给定 nnkk,请你计算有多少个“好”的数组 [b1,b2,,bk][b_1,b_2,\ldots,b_k]。答案可能很大,请输出对 109+710^9+7 取模后的结果。

Input Format

第一行包含一个整数 tt1t1041 \leq t \leq 10^4),表示测试用例的数量。 接下来的 tt 行,每行描述一个测试用例。

每个测试用例的第一行包含两个整数 nnkk1n51051 \leq n \leq 5 \cdot 10^50kn0 \leq k \leq n)。

保证所有测试用例中 nn 的总和不超过 51055 \cdot 10^5

Output Format

对于每个测试用例,输出一个整数,表示“好”的数组 bb 的数量,对 109+710^9+7 取模。

5
1 0
1 1
2 2
3 1
4 2
1
1
2
2
7

Hint

我们来分析样例中的第四个测试用例,其中 n=3n=3k=1k=1。初始时 a=[1,2,3]a=[1,2,3]。 我们来看所有可能的 bb 数组,经过第一步操作后 aa 的变化。

  • b=[1]b=[1]。则 aa 变化为:[1,2,3][3,2,1][3,2][1,2,3]\to[3,2,1]\to[3,2]。数组 [3,2][3,2] 不是递增的。
  • b=[2]b=[2]。则 aa 变化为:[1,2,3][1,3,2][1,3][1,2,3]\to[1,3,2]\to[1,3]。数组 [1,3][1,3] 是递增的。
  • b=[3]b=[3]。则 aa 变化为:[1,2,3][1,2,3][1,2][1,2,3]\to[1,2,3]\to[1,2]。数组 [1,2][1,2] 是递增的。

可以发现有两种“好”的数组 b=[2]b=[2]b=[3]b=[3],所以该测试用例的答案是 22

由 ChatGPT 4.1 翻译