问题描述
现在,摆在早苗面前的是一道简单题。只要解决了这道简单题,早苗就可以发动她现人神的能力了:
输出
输入格式
第一行是一个整数 (T),代表有 (T) 组数据。
下来 (T) 行,一行一个整数 (n)。
输出格式
(T) 行,一行一个整数,是你的答案。
样例一
input
2
3
5
output
0
1
数据范围与约定
对于 (30\%) 的数据,(T leq 10),(n leq 100)。
对于 (50\%) 的数据,(T leq 100000),(n leq 100000)。
对于另外 (30\%) 的数据,(T leq 2),(n leq 10^{12}-1)。
对于所有的数据,(1 leq T leq 1145140),(1 leq n leq 10^{18}-1)。
时间限制: (1mathrm{s})
内存限制: (256mathrm{MB})
题解
本文整理自flyinghearts的博客。
记 (f(x,y)) 为从 (x) 一路异或到 (y) 的值。(mathrm{xor}) 异或,(mathrm{or}) 是或。
对于 (f(2^k,2^{k+1}-1)) 这 (2^k) 个数,它们的最高位显然是第 (k) 位。最高位的 (1) 的个数为 (2^k)。
(k geq 1) 时, (2^k) 为偶数,(mathrm{xor}) 下来成了 (0)。将这些数的最高位抹去,(f) 的值不变,则 (f(2^k,2^{k+1}-1)=f(2^k-2^k,2^{k+1}-1-2^k)=f(0,2^k-1))。
则 (f(0,2^{k+1}-1) = f(0,2^k-1) mathrm{xor} f(2^k,2^{k+1}-1)=0) 当 (k geq 1) 时。
即 (f(0,2^k-1)=0) 当 (k geq 2) 时。
对于 (n geq 4),设其最高位 (1) 在第 (k) 位,则 (k geq 2)。
(f(0,n)=f(0,2^k-1) mathrm{xor} f(2^k,n)=f(2^k,n))
对于 (2^k sim n) 这 (n-2^k+1) 个数,最高位有 (m=n-2^k+1) 个 (1)。
(n) 与 (n-2^k) 同奇偶。
- 当 (n) 为奇数时
(m) 是偶数,则 (f(2^k,n)=f(0,n-2^k))。
递降这个公式,也即相当于不断剥去 (n) 最高位的 (1),得到 (f(0,n)=f(0,n mod 4))。
(n equiv 1 pmod 4) 时,(f(1,n)=f(0,n)=f(0,1)=1)。
(n equiv 3 pmod 4) 时,(f(1,n)=f(0,n)=f(0,3)=0)。
- 当 (n) 为偶数时
(m) 是奇数,则 (f(2^k)=f(n-2^k) mathrm{or} 2^k)。
递降这个公式,得 (f(0,n)=eta mathrm{or} f(0,n mod 4))。
其中 (eta) 是 (n) 将第 (0,1) 位置 (0) 后的数。
(n equiv 0 pmod 4) 时,(f(1,n)=f(0,n)=n)。
(n equiv 2 pmod 4) 时,(f(1,n)=f(0,n)=n+1)。
综上所述
因此我们得到了 (mathrm{O}(1)) 算法