设当前总量为 S,任意合法拆分可以表示为两个整数 x 和 S−x,其中 0≤x≤S。目标是求:
0≤x≤Smin(x⊕(S−x))利用位运算恒等式:
a+b=(a⊕b)+2(a∧b)代入 a=x,b=S−x,得到:
S=x⊕(S−x)+2(x∧(S−x))某资源分配系统需要将一个总量为 S 的整数资源拆分成两个整数部分:第一部分为 x,第二部分为 S−x,其中 0≤x≤S。定义该拆分的「分裂差异值」为 D(x)=x⊕(S−x),其中 ⊕ 表示按位异或运算,即两个二进制表示对应的位相同时结果为 0,不同时结果为 1。对于给定的每个总量 S,请计算所有合法拆分中可以取到的最小分裂差异值。
约束:询问个数不超过 10^5;每个总量 S 满足 1 <= S <= 10^18。
第一行包含一个整数 n,表示询问个数,满足 1 <= n <= 10^5。
接下来 n 行,每行包含一个整数 S,表示当前要处理的总量,满足 1 <= S <= 10^18。
输出 n 行,每行一个非负整数,表示对应总量 S 的最小分裂差异值。
输入
4
1
2
6
7
输出
1
0
0
7
说明
对于 S=1:合法拆分只有 x=0,S−x=1,因此 D(0)=0⊕1=1,最小值为 1。
对于 S=2:取 x=1,此时 S−x=1,1⊕1=0;由于异或非负,最小值为 0。
对于 S=6:偶数可以均分为 3+3,两个相同数异或为 0,因此最小值为 0。
对于 S=7:二进制为 1112,均分为 3 和 4,3⊕4=0112⊕1002=1112=7,所以最小值为 7。
输入
3
9
15
18
输出
1
15
0
说明
对于 S=9:均分为 4 和 5,4⊕5=1002⊕1012=0012=1,因此最小值为 1。
对于 S=15:二进制 11112 全为 1,均分为 7 和 8,7⊕8=01112⊕10002=11112=15,最小值为 15。
对于 S=18:偶数可以均分为 9+9,两个相同数异或为 0,所以最小值为 0。
输入
2
1000000000000000000
576460752303423487
输出
0
576460752303423487
说明
对于 S=1018:这是一个偶数,均分为 500000000000000000 和 500000000000000000,两个相同数异或为 0,所以最小值为 0。
对于 S=576460752303423487:该数等于 259−1,二进制为连续的 59 个 1。均分为 288230376151711743 和 288230376151711744,异或结果为 576460752303423487。这一类全 1 数的最小分裂差异值等于其本身。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册