康托展开与逆康托展开

康托展开

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}
原文地址:https://www.cnblogs.com/mollnn/p/14557646.html