一些想法与优化
查看原帖
一些想法与优化
50167
Imagine楼主2021/8/21 10:53

好像本题不能交题解?

这里给出一种所有子任务下询问问题 2 的次数都不超过 1313 的做法。

朴素的做法是:假设我们想要知道 [1,m][1, m] 内的数分别在什么位置,我们可以先询问一次问题 2 来知晓 (m2,m](\frac{m}{2}, m] 的位置集合,再借助问题 1 用数 m+1m + 1 去对这些位置上的数分别取模,从而确定出它们各自的值是多少(m+1m + 1(m2,m](\frac{m}{2}, m] 内的任意数取模的结果都是不一样的),最后再通过递归来进一步求 [1,m2][1, \frac{m}{2}] 内的数的位置。这样,我们只需要在最开始先询问一次问题 2 来确定出 nn 的位置,然后利用上述做法求 [1,n1][1, n - 1] 内的数的位置即可得到整个排列。该方法所需的问题 2 的询问次数为 1+logn1 + \log n,当 n=5×104n = 5 \times 10^4 时为 1616

考虑如何优化一次询问。注意到 5mod1=0,5mod2=1,5mod3=25 \bmod 1 = 0, 5 \bmod 2 = 1, 5 \bmod 3 = 2,而 4999949999 不断(整)除以 22 恰好会得到 66,也即:当我们想要知道 [1,6][1, 6] 内的数分别在什么位置时,我们先确定出 4,5,64, 5, 6 的位置,之后无需再继续递归,而是用 55 分别对剩下三个未确定位置上的数取模,利用模数就能将 1,2,31, 2, 3 的位置判断出来。这样就节省了一次询问,即在最后一个子任务下只需 1515 次询问 2 即可求出排列。这足以通过本题。

延续上面的思路:如果一个数 xx 除以从 11 开始的一段连续自然数 1r1 \sim r 的余数均不相同,那么利用 xx 就能够把 1r1 \sim r 的位置判断出来。又因为 xmod1=0x \bmod 1 = 0,因此 xmod2x \bmod 2 必然为 11xmod3x \bmod 3 必然为 22……即 xmodi=i1(1ir)x \bmod i = i - 1(1 \leq i \leq r)。写一份程序可以找到在 5000050000 以内满足这一性质的最佳数 x=27719x = 27719,它对应的 r=12r = 12。也即:如果我们找到了 2771927719 的位置,那么当我们递归到 [1,m][1, m] 满足 m12m \leq 12 时就可以停止使用朴素做法,直接利用 2771927719 就可以确定出 1m1 \sim m 所有数的位置。这样当 n=5×104n = 5 \times 10^4 时我们在朴素做法的基础上减少了三次递归,问题 2 的询问次数也降至了 logn2=13\log n - 2 = 13

利用 2771927719 这一特殊数,子任务 3 和 4 询问问题 2 的次数仍不能得到有效优化,因为这两个子任务的 nn 达不到 2771927719。略微缩小查找范围,我们可以找到另一个特殊数 25192519,它对应的 r=10r = 10。使用该数可以使子任务 3 的询问问题 2 的次数降至 1212,子任务 4 的询问次数降至 1111

提交记录见 https://www.luogu.com.cn/record/56559221

2021/8/21 10:53
加载中...