问题转化
题目中的“遮挡事件”即为逆序对,即满足 i<j 且 pi>pj 的数对。问题转化为:在所有 1∼n 的排列中,前两个元素满足 p1<p2,且逆序对总数不超过 k 的排列个数。
无限制条件下的逆序对计数
记 f[i][j] 表示 1∼i 的全排列中,逆序对恰好为 j 的方案数。
将数字 i 插入到 1∼i−1 的某个排列中,可以放在不同位置从而增加 0,1,…,i−1 个逆序对:
有 n 个人,他们的身高分别为 1,2,…,n,且互不相同。他们随机排成一列,得到一个排列 p1,p2,…,pn。
我们称有序对 (i,j) 若满足 i<j 且 pi>pj 为一个“遮挡事件”。换句话说,前面的人比后面的人高即为一次遮挡。
现在要求前两个人的身高必须严格递增,即 p1<p2。并且,总的遮挡事件次数不超过 k。
请你计算满足条件的排列方案总数。由于答案可能很大,需要对 109+7 取模。
约束条件:
输入仅一行,包含两个由空格分隔的整数 n 和 k。
输出一行一个整数,表示满足条件的方案数模 109+7 的结果。
输入
3 0
输出
1
说明
当 n=3、k=0 时,只有完全升序排列满足逆序对个数不超过 0。在 n=3 的排列中,只有 (1,2,3) 是升序排列,且它满足 p1<p2,因此方案数为 1。
输入
4 3
输出
9
说明
对于 n=4,满足 p1<p2 的排列共有 12 个(即全部 24 个排列的一半)。其中逆序对个数不超过 3 的有 9 个。
逆序对个数分别为 0、1、2、3 且满足 p1<p2 的排列数依次为 A0=1、A1=2、A2=3、A3=3,累加得到 1+2+3+3=9。
输入
5 5
输出
41
说明
当 n=5 时,所有排列的逆序对分布为 f[5][0]=1,f[5][1]=4,f[5][2]=9,f[5][3]=15,f[5][4]=20,f[5][5]=22,…。利用关系 Aj=f[5][j]−Aj−1 且 A0=1,可求得:
A0=1,A1=3,A2=6,A3=9,A4=11,A5=11。
将这些值累加至 k=5 即得 1+3+6+9+11+11=41。
输入
6 4
输出
64
说明
n=6 时逆序对分布为 f[6][0]=1,f[6][1]=5,f[6][2]=14,f[6][3]=29,f[6][4]=49,…。同样用 Aj=f[6][j]−Aj−1 计算满足 p1<p2 的排列数:
A0=1,A1=4,A2=10,A3=19,A4=30。
累加到 k=4 得到 1+4+10+19+30=64。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.