Codeforces Round #618 (Div. 1)

E. So Mean

题目描述

点此看题

解法

其实我自己快做出来了,说出来我自己都不信,构造题就是要多观察:

虽然看到这题没什么思路,但是我们可以乱手玩一下,因为询问限制较弱我们就考虑先确定一个数吧,可以询问每组 (n-1) 个数,设没询问的数是 (i),我们可以提前算出他们的求和是:

[1+2+...+(i-1)+(i+1)+....+n=frac{n(n+1)}{2}-i=frac{1cdot 2}{2}-i=1-imod(n-1) ]

不难发现当且仅当 (i=1or i=n) 时回答是YES,由于出题人善良的提示我们知道我们是区分不出来 (1)(n) 的,因为整个数列的值可以全部翻转但还是符合所有的询问,所以随意指定即可,现在我们得到了 (1)(n) 的具体位置。

那么能不能扩展上面的做法呢?能不能用类似的方法确定 (2)(n-1) 呢?假设我们已经确定了 (k) 对这样的数,那么剩下的数是 ([k+1,n-k]),我们询问每组 (n-2k-1) 个数,可以提前计算出求和,技巧是把所有数提出 (k)

[k+1+...+(n-k)-i=kcdot (n-2k-1)+frac{(n-2k)(n-2k+1)}{2}-(i-k)=1-(i-k)mod (n-2k-1) ]

当且仅当 (i=k+1or i=n-k) 的时候回答是 YES,所以我们可以得到 (k+1)(n-k) 的具体位置。

分析一下现在的总操作数:(n+(n-2)+(n-4)...=frac{n^2+2n}{4}),还不能过题。


如果说上面东西还是人能想到的话,下面就是神仙操作了。注意到这题的信息是和取模有关的,可以求算出每个数模某个数的余数,然后用中国剩余定理拼起来,这道题我们选模数 (3,5,7,8),他们是互质的,而且 (3cdot 5cdot 7cdot 8=840geq 800geq n),为了能用这些模数我们先用暴力方法处理出前 (8) 个数,消耗 (5n) 步。

考虑怎么求算每个数模 (3) 的余数,我们可以先用 (1,2) 和这个数问一下看是不是 (3) 的倍数,然后用 (1,3) 和这个数问一下看模 (3) 是否为 (2),剩下的模 (3)(1),消耗步数 (n+frac{2n}{3}),模 (5) 和 模 (7) 都类似,消耗步数分别是 (n+frac{4n}{5}...+frac{2n}{5})(n+frac{6n}{7}...+frac{2n}{7})

对于 (8) 我们不能类似地用 (n+frac{7n}{8}...+frac{2n}{8}),由于 (8)(2) 的幂次我们可以考虑倍增,首先花 (n) 步得知它的奇偶性,然后用 (1,2,3) 来区分 (4k)(4k+2),用 (1,2,4) 来区分 (4k+1)(4k+3),又花费 (n) 步。我们用 (1,2,3,n-3,n-2,n-1,n) 来区分 (8k)(8k+4)(8k+1)(8k+5) 等也同理,再花费 (n) 步。

现在计算一下总步数为 (15.324n),然后这个题变成了大模拟,所以我没打代码

原文地址:https://www.cnblogs.com/C202044zxy/p/14791800.html