连续数字异或和

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

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

我们设f(x,y)表示区间[x,y]的异或和
那么有
对于k>=1
f(2k,2k+11)中,最高位2k的1出现了2k次,异或和为0,所以最高位可以去掉
f(2k,2k+11)=f(2k2k,2k+112k)=f(0,2k1)
所以
f(0,2k+11)=f(0,2k1)Xorf(2k,2k+11)=0

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

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

那么我们有:
如果n为奇数
n1(mod4)f(0,n)=1
n3(mod4)f(0,n)=0

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

那么我们有:
如果n为偶数
n0(mod4)f(0,n)=n
n2(mod4)f(0,n)=n+1

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

n0(mod4)f(0,n)=n
n1(mod4)f(0,n)=1
n2(mod4)f(0,n)=n+1
n3(mod4)f(0,n)=0

posted @   Mychael  阅读(7968)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示