[51nod异或约数和] 整除分块+打表找规律

在这里插入图片描述

  • emm。首先我想到一个 n l o g 2 n n*log_2 n 的算法,就是对于每一个数,枚举它的倍数,然后筛一下。35分get。
  • 诶,在计算总答案的公式中,一个数被异或的时候,肯定是被作为约数的时候。那么一个数被异或的次数肯定是 n i \frac{n}{i} 。如果为奇数,就把它异或上,不然就不管。 O ( n ) O(n) 算法,45分美滋滋。
  • 嗯? n i \frac{n}{i}? 整除分块搞一下是不是就 n \sqrt n 了啊。哦,但是它好像涉及到一个求连续区间的异或和问题,我们需要 O ( 1 ) O(1) 。转化一下, l r l到r 的区间异或和等于 1 1 l 1 l-1 的异或和^ 1 1 r r 的异或和。从1到n的异或和怎么 O ( 1 ) O(1) 求?打表找规律!
  • 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
    i f ( n   m o d   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
    i f ( n   m o d   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)

2 k 2^k 2 k + 1 1 2^{k+1}-1 2 k 2^k 个数,最高位的一个数为 2 k 2^k

若有 k > = 1 k>=1 ,则 2 k 2^k 为偶数,将这 2 k 2^k 个数的最高位去掉,异或和不变

因此 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 ( 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 , 2 k 1 ) = 0 f(0,2^k-1)=0

对于 f ( 0 , n ) n 4 ,f(0,n),n\geq4 设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)

对于 2 k 2^k n n n 2 k + 1 n-2^k+1 个数,最高位共有 m = n 2 k + 1 m=n-2^k+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

由于 n 2 k n-2^k 与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)

n % 4 = 1 n\%4=1 f ( 0 , n ) = f ( 0 , 1 ) = 1 f(0,n)=f(0,1)=1

n % 4 = 3 n\%4=3 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 ( 0 , n % 4 ) x o r 2 k x o r f(0,n)=f(0,n\%4)xor 2^kxor n [ k ] 2 k 1 x o r n[k]*2^k-1 xor\cdots n [ 2 ] 2 2 n[2]*2^2

n[k]表示n的二进制表示的第k位

显然当n为偶数时 f ( 0 , n ) f(0,n) 的二进制从最高位到第3位和n的二进制表示相同

此时我们只需要判断第二位

n % 4 = 0 n\%4=0 f ( 0 , n ) = n f(0,n)=n

n % 4 = 2 n\%4=2 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}

猜你喜欢

转载自blog.csdn.net/qq_39759315/article/details/88783219