康托展开
一年前就看到过康拓展开的题,当时完全不想动脑,以至于连别人的博客都没看懂...
今天随机跳题又出了一道康拓展开的,结果自己差不多想出来了...
这里只是简简单单记录一下我学过它,真想学懂见上方↑
(正向)康托展开
从前往后,就是每次都想前几位固定的情况下,只看后几位有几个数比当前的大。
虽然后几位还不好确定但是这是一会儿下一位的范畴,可以确定的是当前这一位比它小的一定就比当前数小。
所以就在怎么算这些第一位就比他小的个数:
首先,剩下的数一定是除去前面已经算过的数的,否则结果会有问题。
然后剩下的数可以组出的数由排列组合可得第一位固定的情况下,这个数有 \((n-i)!\) 种排列(\(n\) 是一共几位,\(i\) 是当前是第几位)
最后就是第一位的可选数个数,就像上面说的,比它小的要除去已经用过的就好,这里对于数据大的可以用树状数组优化。
逆康托展开
直接像算进制数一样算就好了
一定记住 要先减一!!!
然后依次拿之前的余数除以 \((n-i)!\) 得到商和余数,商就是前面没用过的比当前数小的个数,这样就可以找到当前这一位的数了(同样可以树状数组+二分优化)。
就这么简单,至于代码嘛...我还没写 /颤抖