连续数字异或和

求[1,n]所有数的异或和

如果加以打表,我们会发现其异或和有一定的规律

我们设f(x,y)表示区间[x,y]的异或和
那么有
对于k>=1
\(f(2^k,2^{k + 1} - 1)\)中,最高位\(2^k\)的1出现了\(2^k\)次,异或和为0,所以最高位可以去掉
\(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) Xor f(2^k,2^{k + 1} - 1) = 0\)

由此,对于所有\(k>=2\),有\(f(0,2^k - 1) = 0\)
所以,对于\(f(0,n)\),设其最高位为\(2^k\)
那么\(f(0,n) = f(0,2^k - 1) Xor f(2^k,n) = f(2^k,n)\)
\([2^k,n]\)中,最高位出现的次数取决与n的奇偶

1、若n为奇数,那么最高位出现了\(n + 1\)次为偶数,可以去掉
\(f(2^k,n) = f(0,n - 2^k)\),可以发现\(n - 2^k\)与n具有相同的奇偶性,可以利用同样的推导去掉
最后\(f(0,n)\)的就取决于<4的部分,即mod 4后的异或和

那么我们有:
如果n为奇数
\(n \equiv 1 \pmod{4}\)\(f(0,n) = 1\)
\(n \equiv 3 \pmod{4}\)\(f(0,n) = 0\)

2、若n为偶数,那么最高位出现了\(n + 1\)次为奇数,一定可以保留
同样的,\(f(2^k,n) = f(0,n - 2^k)\),可以发现\(n - 2^k\)与n具有相同的奇偶性,可以利用同样的推导去掉
最后\(f(0,n)\)的后两位就取决于<4的部分

那么我们有:
如果n为偶数
\(n \equiv 0 \pmod{4}\)\(f(0,n) = n\)
\(n \equiv 2 \pmod{4}\)\(f(0,n) = n + 1\)

这样,我们就get了一个\(O(1)\)求连续数字异或和的方法

\(n \equiv 0 \pmod{4}\)\(f(0,n) = n\)
\(n \equiv 1 \pmod{4}\)\(f(0,n) = 1\)
\(n \equiv 2 \pmod{4}\)\(f(0,n) = n + 1\)
\(n \equiv 3 \pmod{4}\)\(f(0,n) = 0\)

转载于:https://www.cnblogs.com/Mychael/p/8633365.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值