异或前缀和-异或和-异或---笔记

异或xor

a⊕b = (¬a ∧ b) ∨ (a ∧¬b)  ==》 0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)

性质1:恒等律:a⊕0=a

性质2:归零律:a⊕a=0

由上面两个性质可以知道:a⊕b⊕b=a  ==》S(l,r)=S(0,R)⊕S(0,L-1)

(异或前缀和:S(0,n),后简写为Sn,Sn=a1⊕a2⊕...⊕an)

异或和

实际是数列a=[a1,a2,a3...]两两异或后累加,即ans=\sum \sumai⊕aj

利用异或的两个性质,由于异或不进位,可以把运算拆分为每个二进制位的先异或再累加。

ans=\sum \sumai⊕aj=\sum \sumai1⊕aj1  \sum \sumai2⊕aj2  \sum \sumai3⊕aj3  

再考虑每个二进制位,由于异或只有在(01)时产生贡献,可以先统计数列a所有数的各个二进制位到b[][],那么ai⊕aj的第x位就是b[i][x]⊕b[j][x]

再看异或和ans=\sum \sumai⊕aj,ans第x位就是\sum \sumb[i][x]⊕b[j][x],考虑到b[i][x]⊕b[j][x]只有0和1,可以视为:只有1和0的序列中所有(1,0)(0,1)的组合的数目,就是p0*p1(p1表示b[1~n][x]中1的数目)

因此,计算ans=\sum \sumai⊕aj

统计数列a第x位1和0的个数,记为p[x][0]、p[x][1]

ans=\sum(p[i][0]*p[i][1])*(1<<i)

异或前缀和 与 异或和 的组合

考虑以下问题:

给定一个数组 Ai​,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1≤L≤R≤n 的L,R,求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L,R 得到的结果加起来的值。

P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

是的,这是蓝桥杯笔记

可以先做前缀异或和Sn,那么题目转化为求\sum \sumSr⊕Sl-1

再利用异或和转化为求\sum(p[i][0]*p[i][1])*(1<<i),p[x][1]为S的第y个二进制位为1的数量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值