CodeForces R.628 D
CodeForces Round 628 D题
给出两非负整数 \(u, \,v\)
求一数组\(a_1,a_2,...,a_n\),
使得
\(1\)数组长度最小
\(2\) \(a_1+a_2\,+\,...\,+\;a_n=v\) 且 \(a_1\oplus a_2 \,\oplus ... \oplus\; a_n=u\)
此题需了解以下位运算性质:
\(Attr.1\)
\[a+b=a \oplus b + 2 * (a\,\&\,b)
\]
简单的说,xor加法如果两数都为1则该位变0,而加法该位变为2(在二进制下进位),所以加法与xor加法的区别就是两倍的\(a\,\&\,b\)。
\(Attr.2\)
\[a\,\&\,b=0 \iff a\oplus b=a+b
\]
1的推论。
\(Attr.3\)
\[a \oplus b=0 \iff a=b
\]
\(Attr.4\)
\[(a \oplus b) \oplus a = b
\]
回到问题。
当 \(u, \,v\)奇偶性不同时,易证无解。
当奇偶性相同时,容易得到一组构造解:\([\;s,s,u\;]\),其中\(s=\dfrac{v-u}{2}\) \(\quad\because (A.3)\)
问题就简化为
\(Problem.1\)
能否找到一组解\([\;x,y\;]\),使得
\[\begin{cases}
x \oplus y = \,u\\
x + y \,= \,v
\end{cases}\]
答案是:取决于\(u \,\& \,s\)
将问题转化一下,利用性质1得到新的问题
\(Problem.2\)
\[\begin{cases}
x \oplus y = \,u\\
x \,\& \,y \,= \,s
\end{cases}\]
设\(a_i=(a>>i)\,\&\,1\),即\(a_i\)表示\(a\)的第\(i\)位二进制码。
此时 \(s_i=1 \Rightarrow x_i=1 , y_i=1\)
而\(x_i=1,y_i=1 \Rightarrow u_i \not= 1\)
所以当\(u_i=1,s_i=1\)时不存在解。
最后,当\(u\&v=0\)时,
解\([u+s,s]\)成立。\(\quad \because (A.2)\)