题目翻译
描述
计算具有特定逆序数的排列数量。
给定一个由1,2,3,…,n构成的排列a1,a2,a3,…,an,一个逆序是指一对(ai,aj),其中i<j且ai>aj。排列中的逆序数反映了该排列的“无序”程度。如果我们想分析排序算法的平均运行时间,通常需要知道n个元素的排列中有多少个恰好具有k个逆序。
在本问题中,你需要计算n个元素的排列中,恰好有k个逆序的排列数量。
例如,当n=3时,共有6个排列,其逆序数如下:
- 123:0个逆序
- 132:1个逆序(3>2)
- 213:1个逆序(2>1)
- 231:2个逆序(2>1,3>1)
- 312:2个逆序(3>1,3>2)
- 321:3个逆序(3>2,3>1,2>1)
因此,对于n=3的排列:
- 1个排列有0个逆序
- 2个排列有1个逆序
- 2个排列有2个逆序
- 1个排列有3个逆序
- 0个排列有4个逆序
- 0个排列有5个逆序
- 以此类推
输入
输入包含一个或多个问题。每个问题的输入占一行,给出两个整数n(1≤n≤18)和k(0≤k≤200)。输入以n=k=0的一行结束。
输出
对于每个问题,输出{1,2,…,n}的排列中恰好有k个逆序的排列数量。
示例输入 1
3 0
3 1
3 2
3 3
4 2
4 10
13 23
18 80
0 0
示例输出 1
1
2
2
1
5
0
46936280
184348859235088
数学说明
设I(n,k)为n个元素的排列中恰好有k个逆序的排列数量,则递推关系为:
I(n,k)=i=0∑min(k,n−1)I(n−1,k−i)
其中,初始条件为I(1,0)=1,其余I(1,k)=0。
该问题可以通过动态规划高效求解。