康托展开
X=a[1]*(n-1)!+a[2]*(n-2)!+...+a[n-i]*i!+...+a[n]*0!
其中,a[i]
表示当前位之后小于当前数的个数
例如排列 34152
p[1]=3 -> {4,1,5,2}<3 -> {1,2} -> a[1]=2
p[2]=4 -> {1,5,2}<4 -> {1,2} -> a[2]=2
p[3]=1 -> {5,2}<1 -> {} -> a[3]=0
...
2 * 4! + 2 * 3! + 0 * 2! + 1 * 1! + 0 * 0! = 61
逆康托展开
例如数值 61,倒推出 a[]
是容易的,实现用一个 vector
辅助一下
a[1]=2 -> rank 2(+1) in {1,2,3,4,5} -> p[1]=3
a[2]=2 -> rank 2(+1) in {1,2,4,5} -> p[2]=4
a[3]=0 -> rank 0(+1) in {1,2,5} -> p[3]=1
...
p[]={3,4,1,5,2}