Skip to content

异或前缀和

约 346 字大约 1 分钟

2026-01-28

小苯的最短路

小苯有一个 nn 个点的无向完全图,编号从 11 到 nn,其中 ii 号点和 jj 号点之间的边权为 i⊕ji \oplus j 他想知道从 11 号点出发到达所有点的最短路,请你帮他算一算吧。

输入

本题含有多组测试数据。

第一行包含一个正整数 TT,表示测试数据的组数,满足 1≤T≤1051 \leq T \leq 10^5。

接下来 TT 行,每行一个正整数 nn,表示完全图的点数,满足 1≤n≤2×1091 \leq n \leq 2 \times 10^9。

输出

对于每组测试数据,输出一行一个正整数 SS,表示到所有点的最短路的异或和。设 did_i 表示从 11 号点到 ii 号点的最短路,则有:

S=d1⊕d2⊕d3⊕⋯⊕dnS = d_1 \oplus d_2 \oplus d_3 \oplus \cdots \oplus d_n

解答

其它过程过于简单不讨论,核心在于如何快速求得 ⨁i=1ni\bigoplus_{i=1}^{n} i 。

根据异或前缀和的性质,设 f(n)=⨁i=1nif(n) = \bigoplus_{i=1}^{n} i ,有:

  • 当 nmod  4=0n \mod 4 = 0 时,f(n)=nf(n) = n 。

  • 当 nmod  4=1n \mod 4 = 1 时,f(n)=1f(n) = 1 。

  • 当 nmod  4=2n \mod 4 = 2 时,f(n)=n+1f(n) = n + 1 。

  • 当 nmod  4=3n \mod 4 = 3 时,f(n)=0f(n) = 0 。

因此可以 O(1)O(1) 求得每组数据的答案。

switch(n) {
    case 0: 
        return n;
        break;
    case 1: 
        return 1;
        break;
    case 2: 
        return n + 1;
        break;
    case 3: return 0;
}