异或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=ai⊕aj
利用异或的两个性质,由于异或不进位,可以把运算拆分为每个二进制位的先异或再累加。
ans=ai⊕aj=ai1⊕aj1 ai2⊕aj2 ai3⊕aj3
再考虑每个二进制位,由于异或只有在(0⊕1)时产生贡献,可以先统计数列a所有数的各个二进制位到b[][],那么ai⊕aj的第x位就是b[i][x]⊕b[j][x]
再看异或和ans=ai⊕aj,ans第x位就是b[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=ai⊕aj时
统计数列a第x位1和0的个数,记为p[x][0]、p[x][1]
ans=(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,那么题目转化为求Sr⊕Sl-1
再利用异或和转化为求(p[i][0]*p[i][1])*(1<<i),p[x][1]为S的第y个二进制位为1的数量