2025-10-29 251028星战题解
Generated by GPT 5 Thinking
1. 记号与基本化简
对非负整数 $i,j$,定义 $$ f(i,j)=\min\{x\in\mathbb Z_{\ge 0}\mid i+0.5+x>(j\oplus x)\}. $$
引理 1(去掉 0.5)
对任意整数 $A,B$,有 $$ A+0.5>B\quad\Longleftrightarrow\quad A\ge B . $$ 因此 $$ f(i,j)=\min\{x\in\mathbb Z_{\ge 0}\mid i+x\ge (j\oplus x)\}. \tag{1} $$
证明. 右端是整数,左端是“整数+0.5”。若 $A\ge B$ 则 $A+0.5>B$;反之若 $A+0.5>B$,因为 $A,B\in\mathbb Z$,只可能是 $A\ge B$。∎
接下来用一个标准位运算恒等式:
引理 2(XOR–AND 恒等式)
对任意非负整数 $u,v$,有 $$ u\oplus v = u+v-2(u\&v). $$ 从而 $$ (j\oplus x)-x = j-2(j\&x). \tag{2} $$
证明. 众所周知 $(u\oplus v)+2(u\&v)=u+v$。移项即得。∎
将 (2) 代入 (1),得到
$$ \begin{aligned} f(i,j) &=\min\{x\ge 0\mid i+x\ge j-2(j\&x)\} \\ &=\min\{x\ge 0\mid j-2(j\&x)\le i\}. \end{aligned} \tag{3} $$
令 $y=(j\&x)$。当 $x$ 枚举全部非负整数时,$y$ 恰好枚举 $j$ 的所有子掩码(即 $0\le y\le j$ 且 $(y\&\sim j)=0$)。并且对任何给定子掩码 $y$,取 $x:=y$ 就能达到同一个 $j\&x=y$ 且使 $x$ 最小。因此 (3) 等价于
$$ f(i,j)=\min \{y\subseteq j\mid j-2y\le i\}, \tag{4} $$ 其中“$y\subseteq j$”表示 $y$ 是 $j$ 的子掩码。
由 (4) 立刻得到两个基本性质:
- 若 $i\ge j$,则取 $y=0$ 合法,故 $f(i,j)=0$。
- 否则 $i<j$,令 $$ t:=\left\lceil\frac{j-i}{2}\right\rceil\in\{1,2,\dots,\left\lceil\frac j2\right\rceil\}, $$ 则 (4) 等价于“在 $j$ 的子掩码中找不小于 $t$ 的最小者”。
为此定义:
定义. 对整数 $j\ge 0$ 与 $t\in\mathbb Z$,定义 $$ s_j(t):=\min \{y\subseteq j\mid y\ge t\},\qquad\text{若集合为空则不定义。} $$ 为了统一边界,约定 $s_j(t)=0$ 当 $t\le 0$。
于是得到一个完全显式的表达式:
$$ f(i,j)=s_j\left(\left\lceil\frac{j-i}{2}\right\rceil\right).\tag{5} $$
特别地,(5) 也涵盖了 $i\ge j$ 的情形(此时 $t\le 0$,按约定 $s_j(t)=0$)。
2. 对 $g(j)$ 的配对化简
题目中的 $$ g(J):=\sum_{i=0}^{10^{10^{100}}} f(i,J) $$ 由于 $f(i,J)=0$(当 $i\ge J$),实际上是 $$ g(J)=\sum_{i=0}^{J-1} f(i,J)=\sum_{i=0}^{J-1} s_J\left(\left\lceil\frac{J-i}{2}\right\rceil\right). $$
将 $i$ 与 $J-1-i$ 成对,注意 $$ \left\lceil\frac{J-i}{2}\right\rceil= \begin{cases} t,&\text{某个 }t, \\ t,&\text{配对项也给出同一个 }t, \end{cases} $$ 于是每个 $t$(除了 $J$ 为奇数时的中位 $t=(J+1)/2$)均恰好出现两次。严格化写成:
$$ g(J)=2\sum_{t=1}^{\lfloor J/2\rfloor} s_J(t)+[J\text{ 为奇}]\cdot s_J\big((J+1)/2\big). \tag{6} $$
(这里 $[P]$ 为命题 $P$ 的指示函数。)
3. $s_j(\cdot)$ 的分段与 $S(j)$ 的递推
记 $j$ 的最高位为 $2^k$(即 $2^k\le j<2^{k+1}$),把 $$ j=2^k+r,\qquad 0\le r<2^k. $$ $j$ 的子掩码分为两类:
- 不含最高位:恰是 $r$ 的全部子掩码;
- 含最高位:形如 $2^k+u$,其中 $u$ 是 $r$ 的子掩码。
据此得到对任意 $t$ 的分段表达:
$$ s_j(t)= \begin{cases} s_r(t), & 1\le t\le r \\[2pt] 2^k, & r<t\le 2^k \\[2pt] 2^k+s_r(t-2^k), & 2^k<t\le 2^k+r. \end{cases}\tag{7} $$
注:题目的查询保证 $a_l=1$,于是 $\mathrm{val}(l,r)$ 的最高位固定存在,即对应用到的 $t$ 都不超过 $j$,所以 (7) 的定义域覆盖了我们需要的全部 $t$。
为了处理 (6) 中的 $\sum s_J(t)$,定义前缀和函数 $$ S(x):=\sum_{t=1}^{x}s_x(t),\qquad S(0):=0. \tag{8} $$
利用 (7) 对 $x=j=2^k+r$ 做拆分求和,直接计算可得
$$ \boxed{S(2^k+r)=2S(r)+4^k},\qquad S(0)=0. \tag{9} $$
这是一条核心递推:把一个数剥去最高位后,对“右侧剩余”的贡献加倍,同时加上最高位的平方 $4^k$。
4. $g(J)$ 的统一闭式(不分奇偶)
回到 (6)。注意当 $J=2^k+r$ 时, $$ \lfloor J/2\rfloor - r \in \{0,1,\dots,2^k-r\},\quad [J\text{ 为奇}]=J-2\lfloor J/2\rfloor. $$ 将 (7) 的前两段代入 (6)(因为 $r<\frac{J}{2}\le 2^k$ 恒成立;当 $r=\lfloor J/2\rfloor$ 时第二段恰为空和也成立),并整理奇偶项,得到
$$ \begin{aligned} g(J) &=2\Big(S(r)+\big(\lfloor J/2\rfloor-r\big)\cdot 2^k\Big)+[J\text{ 为奇}]\cdot 2^k \\ &=2S(r)+\big(2\lfloor J/2\rfloor+[J\text{ 为奇}]-2r\big)\cdot 2^k \\ &=2S(r)+\big(J-2r\big)\cdot 2^k =2S(r)+4^k-2^k r. \end{aligned}\tag{10} $$
上式自动统一了奇偶两种情形(利用恒等式 $2\lfloor J/2\rfloor+[J\text{ 为奇}]=J$)。这给出 $g(J)$ 的一个非常简短的表达:只需知道 $J$ 的最高位 $2^k$ 与其“尾部” $r$,以及 $S(r)$。
结合 (9),我们可以递归地求出 $S(r)$(不断剥最高位,直到 0),于是 $g(J)$ 也就随之得到。这个过程的递归深度等于 $r$ 的二进制位数($\le \lfloor\log_2 J\rfloor$)。
5. 进一步的显式展开(按 1 位位置计)
为便于实现与校验,我们把 (9) 反复展开。设 $$ J=\sum_{t=0}^k 2^{p_t},\qquad p_k>p_{k-1}>\cdots>p_0\ge 0 $$ 是 $J$ 的 1 位位置(从低位起 0 下标)。不停对“去掉最高位后的尾部”应用 (9),可得
$$ \boxed{S(J)=\sum_{t=0}^{k} 2^{t}\cdot 4^{p_{k-t}}}. \tag{11} $$
上式的系数 $2^{t}$ 正好等于“严格高于当前 1 位的 1 的个数”的 $2$ 次方。用同样的剥离思路,把 (10) 也完全写开,可得
$$ \boxed{g(J)=4^{p_k}+2\sum_{t=0}^{k-1} 2^{t}\cdot 4^{p_{k-1-t}}-2^{p_k}\cdot \sum_{t=0}^{k-1} 2^{p_t}}. \tag{12} $$
当然,实际编码并不一定采用 (12) 的一次性展开;直接用 (10)+(9) 的“逐位剥离”写成循环(或递归)即可,时间 $O(\text{位数})$。
6. 与题面操作的对接与实现要点(思路)
-
询问保证 $a_l=1$。因此 $\mathrm{val}(l,r)=J$ 的最高位 总是 $2^{k}$(其中 $k=r-l$),即 $$ J=2^k + r,\quad r=\text{把 } a_{l+1}\ldots a_{r} \text{ 看成二进制数(低位在右)}. $$ 于是 $$ g(J)=2S(r)+4^k-2^k r \pmod{10^9+7}. $$ 只需能得到:
- 区间长度 $k+1$(显然);
- 区间 $(l+1,\ldots,r)$ 的二进制值 $r$(模 $M$ 即可);
- $S(r)$(模 $M$)。
-
区间翻转 $a_i\leftarrow 1-a_i$ 是典型的“按位取反”的区间操作。可以用懒标记线段树或块状维护两种信息:
- 数值:$r = \sum b_t 2^{t}$;
- “$S(\cdot)$”:根据 (9) 的位剥离递推,把一个节点的区间视为“最高位 + 尾部”,即可在合并时得到该区间对应数的 $S$ 值。 若实现上把一个区间拆成“左半(高位段)+右半(低位段)”,则该区间对应的数 $X$ 与 $S(X)$ 可按 (9)(10) 的思想自底向上合并。
- 懒翻转对这两类量的影响都可在节点内显式推导(对数值是 $r\mapsto (2^{\text{len}}-1)-r$;对 $S$ 可用等价的“位剥离”视角在节点尺度上写出封闭式变换),这里从略。
-
预处理 $\{2^t,4^t\}$ 的幂表即可在模 $10^9+7$ 下常数时间取用。
以上实现细节超出本文数学主线;本题的关键在于把 $f(i,j)$ 化为“子掩码下取下界”的 $s_j(t)$,再通过最高位分治得到 (9)(10)。
7. 小例检验
以样例第一问为例:$\mathrm{val}(1,2)=3$。写成 $J=2^1+r$ 得 $r=1$。
- $S(1)=\sum_{t=1}^{1}s_1(t)=s_1(1)=1$;
- $g(3)=2S(1)+4^1-2^1\cdot 1=2\cdot 1+4-2=4$。吻合样例。
(顺带一提:样例输出展示里第二行把两个答案写在一行了,按照“每个询问一行”的常规应为三行输出。)
8. 结论与复杂度
- 数学结论:对任意 $J=2^k+r,(0\le r<2^k)$,有 $$ \boxed{g(J)=2S(r)+4^k-2^k r,\qquad S(2^k+r)=2S(r)+4^k,~S(0)=0}. $$
- 计算 $g(J)$ 只需沿 $r$ 的二进制位做 $O(\log J)$ 次“去最高位”操作;结合数据结构维护区间的数值与“去最高位递推”,总询问复杂度可达 $O(\log n)$(或块状做 $O(\sqrt n)$),满足约束。



