Description
有一种经典的方法可以从数组中删除一个元素:将要删除的元素与数组的最后一个元素交换,然后删除最后一个元素。
不幸的是,这种方法并不总是能保持数组元素的顺序。你的任务是统计有多少种长度为 k 的删除序列,使得初始为升序排列的数组在经过这些删除操作后仍然保持升序。
给定一个长度为 n 的数组 a,初始时 ai=i,即 a 按升序排列。还给定一个长度为 k 的数组 b,其中元素是 1 到 n 的两两不同的数。
进行 k 步操作,在第 j 步时,选择一个下标 i,满足 1≤i≤n−j+1 且 ai=bj,然后交换 ai 和 an−j+1(如果 i=n−j+1,则不做任何操作)。接着删除当前数组的最后一个元素(即下标为 n−j+1 的元素)。
如果在 k 步操作后,数组 [a1,a2,…,an−k] 仍然严格递增,则称数组 [b1,b2,…,bk] 是“好”的。
给定 n 和 k,请你计算有多少个“好”的数组 [b1,b2,…,bk]。答案可能很大,请输出对 109+7 取模后的结果。
第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
接下来的 t 行,每行描述一个测试用例。
每个测试用例的第一行包含两个整数 n 和 k(1≤n≤5⋅105,0≤k≤n)。
保证所有测试用例中 n 的总和不超过 5⋅105。
对于每个测试用例,输出一个整数,表示“好”的数组 b 的数量,对 109+7 取模。
5
1 0
1 1
2 2
3 1
4 2
1
1
2
2
7
Hint
我们来分析样例中的第四个测试用例,其中 n=3,k=1。初始时 a=[1,2,3]。
我们来看所有可能的 b 数组,经过第一步操作后 a 的变化。
- b=[1]。则 a 变化为:[1,2,3]→[3,2,1]→[3,2]。数组 [3,2] 不是递增的。
- b=[2]。则 a 变化为:[1,2,3]→[1,3,2]→[1,3]。数组 [1,3] 是递增的。
- b=[3]。则 a 变化为:[1,2,3]→[1,2,3]→[1,2]。数组 [1,2] 是递增的。
可以发现有两种“好”的数组 b=[2] 和 b=[3],所以该测试用例的答案是 2。
由 ChatGPT 4.1 翻译