- emm。首先我想到一个 n ∗ l o g 2 n n*log_2 n n∗log2n的算法,就是对于每一个数,枚举它的倍数,然后筛一下。35分get。
- 诶,在计算总答案的公式中,一个数被异或的时候,肯定是被作为约数的时候。那么一个数被异或的次数肯定是 n i \frac{n}{i} in。如果为奇数,就把它异或上,不然就不管。 O ( n ) O(n) O(n)算法,45分美滋滋。
- 嗯? n i ? \frac{n}{i}? in?整除分块搞一下是不是就 n \sqrt n n了啊。哦,但是它好像涉及到一个求连续区间的异或和问题,我们需要 O ( 1 ) O(1) O(1)。转化一下, l 到 r l到r l到r的区间异或和等于 1 1 1到 l − 1 l-1 l−1的异或和^ 1 1 1到 r r r的异或和。从1到n的异或和怎么 O ( 1 ) O(1) O(1)求?打表找规律!
- 设
f
(
n
)
f(n)
f(n)为1到n的异或和,则:
i f ( n m o d 4 = 1 ) , f ( n ) = 1 if(n~ mod~4=1),~f(n)=1 if(n mod 4=1), f(n)=1
i f ( n m o d 4 = 2 ) , f ( n ) = n + 1 if(n~mod~4=2),~f(n)=n+1 if(n mod 4=2), f(n)=n+1
i f ( n m o d 4 = 3 ) , f ( n ) = 0 if(n~mod~4=3),~f(n)=0 if(n mod 4=3), f(n)=0
i f ( n m o d 4 = 0 ) , f ( n ) = n if(n~mod~4=0),~f(n)=n if(n mod 4=0), f(n)=n - 盗一下某人的证明:
证明:
我们先来考虑 f ( 2 k , 2 k + 1 − 1 ) f(2^k,2^{k+1}-1) f(2k,2k+1−1)
从 2 k 2^k 2k到 2 k + 1 − 1 2^{k+1}-1 2k+1−1这 2 k 2^k 2k个数,最高位的一个数为 2 k 2^k 2k;
若有 k > = 1 k>=1 k>=1,则 2 k 2^k 2k为偶数,将这 2 k 2^k 2k个数的最高位去掉,异或和不变
因此 f ( 2 k , 2 k + 1 − 1 ) = f ( 2 k − 2 k , 2 k + 1 − 2 k − 1 ) = f ( 0 , 2 k − 1 ) f(2^k,2^{k+1}-1)=f(2^k-2^k,2^{k+1}-2^k-1)=f(0,2^{k}-1) f(2k,2k+1−1)=f(2k−2k,2k+1−2k−1)=f(0,2k−1)
因而存在 f ( 0 , 2 k + 1 − 1 ) = f ( 0 , 2 k − 1 ) x o r f ( 2 k , 2 k + 1 − 1 ) = 0 f(0,2^{k+1}-1)=f(0,2^k-1) xor f(2^k,2^{k+1}-1)=0 f(0,2k+1−1)=f(0,2k−1)xorf(2k,2k+1−1)=0
即 f ( 0 , 2 k − 1 ) = 0 f(0,2^k-1)=0 f(0,2k−1)=0
对于 , f ( 0 , n ) , n ≥ 4 ,f(0,n),n\geq4 ,f(0,n),n≥4设n二进制表示的最高位1在第k位k>=2;
f ( 0 , n ) = f ( 0 , 2 k − 1 ) x o r f ( 2 k , n ) = f ( 2 k , n ) f(0,n)=f(0,2^k-1) xor f(2^k,n)=f(2^k,n) f(0,n)=f(0,2k−1)xorf(2k,n)=f(2k,n)
对于 2 k 2^k 2k到 n n n这 n − 2 k + 1 n-2^k+1 n−2k+1个数,最高位共有 m = n − 2 k + 1 m=n-2^k+1 m=n−2k+1个1,去除最高位的1
当n为奇数时,m为偶数此时有 f ( 0 , n ) = f ( 2 k , n ) = f ( 0 , n − 2 k ) ∣ 2 k f(0,n)=f(2^k,n)=f(0,n-2^k)|2^k f(0,n)=f(2k,n)=f(0,n−2k)∣2k
由于 n − 2 k n-2^k n−2k与n奇偶性相同,递推上面的公式可得 f ( 0 , n ) = f ( 0 , n − 2 k − 2 k − 1 − 2 k − 2 ⋯ − 2 2 ) = f ( 0 , n % 4 ) f(0,n)=f(0,n-2^k-2^{k-1}-2^{k-2}\cdots -2^2)=f(0,n\%4) f(0,n)=f(0,n−2k−2k−1−2k−2⋯−22)=f(0,n%4)
当 n % 4 = 1 n\%4=1 n%4=1时 f ( 0 , n ) = f ( 0 , 1 ) = 1 f(0,n)=f(0,1)=1 f(0,n)=f(0,1)=1
当 n % 4 = 3 n\%4=3 n%4=3时 f ( 0 , n ) = f ( 0 , 3 ) = 0 f(0,n)=f(0,3)=0 f(0,n)=f(0,3)=0
当n为偶数时,m为奇数,因而 f ( 0 , n ) = f ( 2 k , n ) = f ( 0 , n − 2 k ) x o r 2 k f(0,n)=f(2^k,n)=f(0,n-2^k)xor2^k f(0,n)=f(2k,n)=f(0,n−2k)xor2k
也相当于最高位不变,递推公式可得
f ( 0 , n ) = f ( 0 , n % 4 ) x o r 2 k x o r f(0,n)=f(0,n\%4)xor 2^kxor f(0,n)=f(0,n%4)xor2kxor n [ k ] ∗ 2 k − 1 x o r ⋯ n[k]*2^k-1 xor\cdots n[k]∗2k−1xor⋯ n [ 2 ] ∗ 2 2 n[2]*2^2 n[2]∗22
n[k]表示n的二进制表示的第k位
显然当n为偶数时 f ( 0 , n ) f(0,n) f(0,n)的二进制从最高位到第3位和n的二进制表示相同
此时我们只需要判断第二位
当 n % 4 = 0 n\%4=0 n%4=0时 f ( 0 , n ) = n f(0,n)=n f(0,n)=n
当 n % 4 = 2 n\%4=2 n%4=2时 f ( 0 , n ) = n + 1 f(0,n)=n+1 f(0,n)=n+1
综上所述:
f ( 0 , n ) = f ( 1 , n ) { n n % 4 = 0 1 n % 4 = 1 n + 1 n % 4 = 2 0 n % 4 = 3 f(0,n)=f(1,n)\begin{cases} n\ \ \ \ \ \ \ \quad n\%4=0\\ 1\ \ \ \ \ \ \ \quad n\%4=1\\n+1 \quad n\%4=2\\0\ \ \ \ \ \ \ \quad n\%4=3\\ \end{cases} f(0,n)=f(1,n)⎩⎪⎪⎪⎨⎪⎪⎪⎧n n%4=01 n%4=1n+1n%4=20 n%4=3