#P2323. PERMS

    ID: 1324 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>动态规划组合数学递推Rocky Mountain 2003

PERMS

题目翻译

描述
计算具有特定逆序数的排列数量。

给定一个由1,2,3,,n1, 2, 3, \dots, n构成的排列a1,a2,a3,,ana_1, a_2, a_3, \dots, a_n,一个逆序是指一对(ai,aj)(a_i, a_j),其中i<ji < jai>aja_i > a_j。排列中的逆序数反映了该排列的“无序”程度。如果我们想分析排序算法的平均运行时间,通常需要知道nn个元素的排列中有多少个恰好具有kk个逆序。

在本问题中,你需要计算nn个元素的排列中,恰好有kk个逆序的排列数量。

例如,当n=3n = 3时,共有66个排列,其逆序数如下:

  • 12312300个逆序
  • 13213211个逆序(3>23 > 2
  • 21321311个逆序(2>12 > 1
  • 23123122个逆序(2>12 > 13>13 > 1
  • 31231222个逆序(3>13 > 13>23 > 2
  • 32132133个逆序(3>23 > 23>13 > 12>12 > 1

因此,对于n=3n=3的排列:

  • 11个排列有00个逆序
  • 22个排列有11个逆序
  • 22个排列有22个逆序
  • 11个排列有33个逆序
  • 00个排列有44个逆序
  • 00个排列有55个逆序
  • 以此类推

输入
输入包含一个或多个问题。每个问题的输入占一行,给出两个整数nn1n181 \leq n \leq 18)和kk0k2000 \leq k \leq 200)。输入以n=k=0n = k = 0的一行结束。

输出
对于每个问题,输出{1,2,,n}\{1, 2, \dots, n\}的排列中恰好有kk个逆序的排列数量。

示例输入 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)I(n, k)nn个元素的排列中恰好有kk个逆序的排列数量,则递推关系为:

I(n,k)=i=0min(k,n1)I(n1,ki)I(n, k) = \sum_{i=0}^{\min(k, n-1)} I(n-1, k-i)

其中,初始条件为I(1,0)=1I(1, 0) = 1,其余I(1,k)=0I(1, k) = 0

该问题可以通过动态规划高效求解。