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

在这里插入图片描述

  • emm。首先我想到一个 n ∗ l o g 2 n n*log_2 n nlog2n的算法,就是对于每一个数,枚举它的倍数,然后筛一下。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 lr的区间异或和等于 1 1 1 l − 1 l-1 l1的异或和^ 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+11)

2 k 2^k 2k 2 k + 1 − 1 2^{k+1}-1 2k+11 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+11)=f(2k2k,2k+12k1)=f(0,2k1)

因而存在 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+11)=f(0,2k1)xorf(2k,2k+11)=0

f ( 0 , 2 k − 1 ) = 0 f(0,2^k-1)=0 f(0,2k1)=0

对于 , f ( 0 , n ) , n ≥ 4 ,f(0,n),n\geq4 f(0,n)n4设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,2k1)xorf(2k,n)=f(2k,n)

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

由于 n − 2 k n-2^k n2k与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,n2k2k12k222)=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,n2k)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]2k1xor 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值