C. A Good Problem

问题描述

给定四个正整数 n,l,r,kn, l, r, k。你需要找到一个长度为 nn 的字典序最小*的整数数组 aa,满足:

  1. 对于每个 1in1 \leq i \leq n,都有 lairl \leq a_i \leq r
  2. a1&a2&&an=a1a2ana_1 \And a_2 \And \ldots \And a_n = a_1 \oplus a_2 \oplus \ldots \oplus a_n,其中 &\And 表示按位与操作,\oplus 表示按位异或操作。

如果不存在这样的数组,输出 1-1。否则,由于整个数组可能太大而无法输出,仅输出 aka_k

注意: 当且仅当以下条件之一成立时,数组 aa 的字典序小于数组 bb

  • aabb 的前缀,但 aba \neq b;或者
  • aabb 不同的第一个位置,数组 aa 的元素小于 bb 中对应的元素。

输入

每个测试包含多个测试用例。第一行是测试用例的数量 tt (1t104)(1 \leq t \leq 10^4)。接下来是测试用例的描述。

每个测试用例包含四个正整数 n,l,r,kn, l, r, k (1kn1018,1lr1018)(1 \leq k \leq n \leq 10^{18}, 1 \leq l \leq r \leq 10^{18})

输出

对于每个测试用例,输出 aka_k,如果不存在满足条件的数组,则输出 1-1

题解

如果 nn 是奇数,我们可以构造一个所有元素都等于 ll 的数组。

然后我们可以考虑当 nn 是偶数时会发生什么。在这种情况下,我们可以让 n2n-2 个元素等于 ll,这意味着与操作的结果将是 ll,但异或操作的结果将是 00

最后两个元素应满足条件 l&v1&v2=v1v2=resl \And v_1 \And v_2 = v_1 \oplus v_2 = res。考虑 ll 中的一个位,如果我们想在结果 resres 中保留这个位,那么这个位在 v1v_1v2v_2 中都必须被设置。如果两个位都被设置,那么异或的结果将是 00,这意味着它们是无效的。 因此,对于 ll 中所有被设置的位,我们不能在 v1v_1v2v_2 中都设置它们。 并且值 v1v_1v2v_2 应该大于 ll。 所以我们可以让 v1=v2=2(l的最高位)v_1 = v_2 = 2^{\text{(l的最高位)}}。在这种情况下,res=0\text{res} = 0,并且 v1,v2v_1, v_2 是可能的最小值。

提交链接