异或结论

~~~

S+{ X+(X+S) }=2(X+S)

X^{ X^(X+S) }=X+S

cf 628D

题意:
给定一个u代表一个数组的全部异或给定一个u代表一个数组的全部异或
给定一个u代表一个数组的全部异或

给定一个v代表一个数组的全部和给定一个v代表一个数组的全部和
给定一个v代表一个数组的全部和

问你这个数组最短的长度及其每个元素问你这个数组最短的长度及其每个元素
问你这个数组最短的长度及其每个元素

题解:

对于二进制a+ba+ba+b的某一位来说
a xor ba ~xor~ba xor b可以表示a+ba+ba+b的本位,aaa&bbb可以表示a+ba+ba+b的进位
然后将aaa&bbb左移一位就可以表示a+ba+ba+b
所以可以得到
a+b=a xor b+2∗a&ba+b=a~xor~b+2*a&b
a+b=a xor b+2∗a&b

所以通过本题可以推出
v=u+2∗a&bv=u+2*a&b
v=u+2∗a&b

所以可以知道如果u>vu>vu>v或者(u−v)%2=1(u-v)\%2=1(u−v)%2=1这样是恒不成立的
然后特判一下u=vu=vu=v的情况
if(u=v=0)数组是空的if (u=v=0)数组是空的
if(u=v=0)数组是空的

else数组里只有一个元素uelse 数组里只有一个元素u
else数组里只有一个元素u

其他情况下数组肯定至少有两个元素
然后通过刚才的公式计算出a&ba&ba&b,循环判断a&ba&ba&b和a xor ba~xor~ba xor b的每一个二进制位
如果a&ba&ba&b在该位是111,说明该位每个数都为111,所以用cnt[i]+=2cnt[i]+=2cnt[i]+=2
如果a xor ba~xor~ba xor b在该位是111,说明该位有奇数个111,所以需要cnt[i]+=1cnt[i]+=1cnt[i]+=1
这样cntcntcnt数组的最大数就代表数组的长度
最后循环每次取出一个作为其中一个数二进制位的第i位
首先令x=a&b=(v−u)/2x=a&b=(v-u)/2x=a&b=(v−u)/2
如果长度为333的情况就是出现过两个都为111的时候(((即u&x!=0即u&x!=0即u&x!=0)))
长度为333的时候,其实每个二进制位x=1x=1x=1的时候都在这位加了两次,所以数组中会出现两个xxx,由于每次在某二进制位u=1u=1u=1的时候该位都会加111,所以数组中可以分离出一个uuu
最终可以确定此时数组的元素为[u,x,x][u,x,x][u,x,x]

如果长度为222的情况就是没出现过两个都为111的时候(((即u&x==0即u&x==0即u&x==0)))
此时可以发现数组依旧可以分离出两个xxx,一个uuu,但是此时的数组长度为2,不能全部直接放到数组里。但是此时u&x==0u&x==0u&x==0,说明如果u+x xu+x~xu+x x为1的二进制位u都为0,所以再用一个xxx二者异或就会重新得到u
2

原文地址:https://www.cnblogs.com/poo7/p/12128575.html