康托展开

一年前就看到过康拓展开的题,当时完全不想动脑,以至于连别人的博客都没看懂...

今天随机跳题又出了一道康拓展开的,结果自己差不多想出来了...

戳他,讲的很详细

这里只是简简单单记录一下我学过它,真想学懂见上方↑

(正向)康托展开

从前往后,就是每次都想前几位固定的情况下,只看后几位有几个数比当前的大。

虽然后几位还不好确定但是这是一会儿下一位的范畴,可以确定的是当前这一位比它小的一定就比当前数小。

所以就在怎么算这些第一位就比他小的个数:

首先,剩下的数一定是除去前面已经算过的数的,否则结果会有问题。

然后剩下的数可以组出的数由排列组合可得第一位固定的情况下,这个数有 \((n-i)!\) 种排列(\(n\) 是一共几位,\(i\) 是当前是第几位)

最后就是第一位的可选数个数,就像上面说的,比它小的要除去已经用过的就好,这里对于数据大的可以用树状数组优化。

逆康托展开

直接像算进制数一样算就好了

一定记住 要先减一!!!

然后依次拿之前的余数除以 \((n-i)!\) 得到商和余数,商就是前面没用过的比当前数小的个数,这样就可以找到当前这一位的数了(同样可以树状数组+二分优化)。


就这么简单,至于代码嘛...我还没写 /颤抖

放点题:

几乎就是个板子

真的板子

posted @ 2022-08-08 21:55  _yolanda  阅读(27)  评论(0编辑  收藏  举报