首先,我们可以得到最高位的位数为:(lfloorfrac{n+k-1}{n} floor),记作 (E)。
然后给这 (n) 个长为 (E) 的数字排序,后缀数组 (O((n+E)log E)) 搞定。
然后二分最大的数字,记作 (Max),再记一个 (Next_i),表示从 (i) 开始,数字不大于 (Max) 的最远终点。
可以得到: (E - 1 le Next_i le E),
于是我们在([1, Next_1])范围内枚举起点,然后沿着 (Next_i) 不断跳,看跳完一圈需要的步数,记为 (step)。
如果有 (step le k),那么就更新上界为 (Max),否则更新下界为 (Max + 1)。
要枚举 (O(E)) 个起点,每次要跳 (O(frac{n}{E})) 步,所以每次检验就是 (O(n)) 的了。
什么?数字很大?二分数字不行?
我们二分数字的排名不就可以了吗?
于是这个问题就可以在 (O((n+E)log E + nlog n)) 的时间内解决了。