求[1,n]所有数的异或和
如果加以打表,我们会发现其异或和有一定的规律
我们设f(x,y)表示区间[x,y]的异或和
那么有
对于k>=1
f(2k,2k+1−1)中,最高位2k的1出现了2k次,异或和为0,所以最高位可以去掉
f(2k,2k+1−1)=f(2k−2k,2k+1−1−2k)=f(0,2k−1)
所以
f(0,2k+1−1)=f(0,2k−1)Xorf(2k,2k+1−1)=0
由此,对于所有k>=2,有f(0,2k−1)=0
所以,对于f(0,n),设其最高位为2k
那么f(0,n)=f(0,2k−1)Xorf(2k,n)=f(2k,n)
在[2k,n]中,最高位出现的次数取决与n的奇偶
1、若n为奇数,那么最高位出现了n+1次为偶数,可以去掉
f(2k,n)=f(0,n−2k),可以发现n−2k与n具有相同的奇偶性,可以利用同样的推导去掉
最后f(0,n)的就取决于<4的部分,即mod 4后的异或和
那么我们有:
如果n为奇数
若n≡1(mod4),f(0,n)=1
若n≡3(mod4),f(0,n)=0
2、若n为偶数,那么最高位出现了n+1次为奇数,一定可以保留
同样的,f(2k,n)=f(0,n−2k),可以发现n−2k与n具有相同的奇偶性,可以利用同样的推导去掉
最后f(0,n)的后两位就取决于<4的部分
那么我们有:
如果n为偶数
若n≡0(mod4),f(0,n)=n
若n≡2(mod4),f(0,n)=n+1
这样,我们就get了一个O(1)求连续数字异或和的方法
若n≡0(mod4),f(0,n)=n
若n≡1(mod4),f(0,n)=1
若n≡2(mod4),f(0,n)=n+1
若n≡3(mod4),f(0,n)=0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效