1 条题解

  • 0
    @ 2026-5-16 16:27:18

    给定 n,l,r,kn, l, r, k1kn10181 \le k \le n \le 10^{18}1lr10181 \le l \le r \le 10^{18}),要求构造长度为 nn 的数组 aa,满足:

    1. lairl \le a_i \le r
    2. $a_1 \& a_2 \& \dots \& a_n = a_1 \oplus a_2 \oplus \dots \oplus a_n$;

    在所有合法数组中,输出字典序最小的数组的第 kk 个元素,不存在输出 1-1


    条件分析

    A=a1&a2&&anA = a_1 \& a_2 \& \dots \& a_n X=a1aoplusanX = a_1 \oplus a_oplus \dots \oplus a_n

    已知 A=XA = X

    按位分析

    考虑某一位(二进制位):

    • 如果这一位所有数的 AND = 11,则所有数该位都是 11,且 nn 必须为奇数(否则 XOR 该位 = 00,矛盾)。
    • 如果这一位所有数的 AND = 00,则至少有一个数该位为 00,且 XOR 该位必须为 00 → 该位为 11 的个数为偶数。

    从整体看:


    结论 1:nn 为奇数

    v=A=Xv = A = X
    那么所有数在 vv11 位上全是 11
    vv00 位上,这些位在数组中的出现次数为偶数(这样才能 XOR = 00),且至少有一个 00(保证 AND 该位 = 00)。
    一个简单的构造方法是:让所有数相等,且等于 vv

    • vv11 位当然全 11(所有数在该位 = 11
    • vv00 位在该数组全为 00(出现次数 nnnn 奇数 → 出现次数为奇数,不是偶数!等等,这有问题)

    检查:如果全为 vvvv 某位为 00,那么所有数该位 = 00,1 的个数 = 00(偶数)✅,AND 该位 = 00✅。所以全相同数可行。

    再验证 AND 和 XOR:

    • AND:所有数相同 = vv ⇒ AND = vv
    • XOR:nn 个数相同,nn 为奇数 ⇒ XOR = vv(因为 vvv=vv \oplus v \oplus \dots \oplus v = vnn 奇)。

    所以确实成立。
    a1a_1 要最小 → a1=la_1 = l 即可,全数组为 ll

    结论nn 为奇数时,数组取 [l,l,,l][l, l, \dots, l] 即可。
    所以 ak=la_k = l


    结论 2:nn 为偶数

    此时,从按位分析:

    不能出现某位全 11(否则 AND = 11,XOR = 00 矛盾)。
    所以至少存在一个数在某位为 00 ⇒ AND = 00
    要满足 AND = XOR ⇒ XOR = 00

    等价条件:

    • 数组中所有数的 AND = 00(即对每一位,至少有一个数该位为 00)。
    • 整个数组的 XOR = 00(即对每一位,1 的个数为偶数)。

    因为 nn 是偶数,一组可行构造是:取两个数 xxyy,每个出现 n2\frac{n}{2} 次。

    • AND = x&yx \& y(因为每位的出现模式是 xxyy 交叉)
    • XOR = 00(因为 XOR 相同值偶数次 = 00,再加上两数 XOR 重复的抵消)

    具体:
    若数组由 n2\frac{n}{2}xxn2\frac{n}{2}yy 组成,则 XOR = xyx \oplus y 的出现次数为偶数?不对,
    XOR = (xxx)(x \oplus x \oplus \dots \oplus x) [n2\frac{n}{2} 次] \oplus (yyy \oplus \dots \oplus y) [n2\frac{n}{2} 次]
    偶数次相同数 XOR = 00,所以整体 XOR = 00

    AND = x&yx \& y(因为对每一位:只有 xxyy 同时为 1 时 AND 才为 1)

    所以我们需要 x&y=0x \& y = 0(这样 AND = 00 = XOR)。
    并且 lxyrl \le x \le y \le r

    为了字典序最小,我们把两个 xx 放在前面(索引 1,21,2xx),后面 yy 放在索引 3..n3..n(中间有偶数个,所以 n4n \ge 4 需要)。


    字典序最小构造

    x=lx = l,需要找一个 yy[l,r][l, r] 中,使得 l&y=0l \& y = 0(AND 条件),并尽量小(这样 a3=ya_3 = y 最小)。

    如果 l=0l = 0,那么 x=0x=0yy 可以选任意数,选最小的 y=l=0y = l = 0,那么全数组为 00 ✅(0&0=00 \& 0 = 0,XOR=0)。

    如果 l>0l > 0,则找最小的 yly \ge l 使 l&y=0l \& y = 0
    这个 yy 可以用:

    • ll 逐位,找到一个更高位的 1 跳过重叠。
    • 简单方法:y=(ly = (l 去掉所有 1 位的下一个值)。

    更简单且保证能找到的是: 枚举 llmin(l+1000,r)\min(l+1000, r)(因为 llyy 在低位无公共 1 时,yy 不会太远,若 rlr-l 很大,可能的 yy2log2(l)+12^{\lfloor \log_2(l) \rfloor+1} 的幂次)。

    所以算法:

    1. l=0l=0ak=0a_k = 0(全 0 数组)。
    2. 否则尝试 p=lp = lmin(l+1000,r)\min(l+1000, r)p&l=0p \& l = 0
    3. 若没找到,取 highest=2log2(l)+1highest = 2^{\lfloor \log_2(l) \rfloor+1}(最小的比 ll 大的 2 的幂),若 highestrhighest \le ry=highesty=highest
    4. 若没找到 ⇒ 1-1
    5. 找到 yy 后,输出 aka_k
      k=1k=1k=2k=2ll
      否则 ⇒ yy

    时间复杂度

    • nn 奇数:O(1)
    • nn 偶数:O(1) 或 O(log r)(找最高位)
    • 通过 t104t \le 10^4

    最终答案规律

    • nn 奇数:输出 ll
    • nn 偶数且 l=0l=0:输出 00
    • nn 偶数且 l>0l>0
      • 若存在 y[l,r]y \in [l, r] 使 l&y=0l \& y = 0,取最小的 yy
        输出:k2k \le 2 时输出 ll,否则输出 yy
      • 否则输出 1-1
    • 1

    信息

    ID
    7127
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者