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)\)

posted @ 2020-03-26 18:09  冗余的代码  阅读(126)  评论(0编辑  收藏  举报