#5045. Popcount and XOR

0
    ID: 5045 传统题 2000ms 1024MiB 尝试: 0 已通过: 0 难度: 3 上传者: 标签>AtCoderabc347DGESP 5级位运算(简单)枚举(单层循环)

Popcount and XOR

Popcount and XOR

题目描述

你被给定非负整数 aa、bb 和 CC。 判断是否存在一对非负整数 (X,Y)(X, Y) 满足下面五个条件。若存在这样的一个对,则输出其中一对。

0 \leq X < 2^{60} 0 \leq Y < 2^{60} popcount⁡(X)=a\operatorname{popcount}(X) = a popcount⁡(Y)=b\operatorname{popcount}(Y) = b X⊕Y=CX \oplus Y = C

这里,⊕\oplus 表示按位异或。 如果有多个满足条件的对 (X,Y)(X, Y),你可以输出其中任意一对。

什么是 popcount? 对于非负整数 $x$,$x$ 的 popcount 是其二进制表示中 $1$ 的个数。 更精确地,对于非负整数 $x$,若 $\displaystyle x=\sum _ {i=0} ^ \infty b _ i2 ^ i\ (b _ i\in\lbrace0,1\rbrace)$,则有 $\displaystyle\operatorname{popcount}(x)=\sum _ {i=0} ^ \infty b _ i$。

例如,1313 的二进制是 11011101,所以 popcount⁡(13)=3\operatorname{popcount}(13)=3。

什么是按位异或? 对于非负整数 $x, y$,按位异或 $x \oplus y$ 定义如下。

在二进制表示中,第 2k2^k 位  (k≥0)\ (k\geq0) 在 x⊕yx \oplus y 中为 11 当且仅当在 xx 和 yy 的二进制表示中第 2k2^k 位恰好有一个为 11,否则为 00。

例如,99 和 33 的二进制分别是 10011001 和 00110011,因此 9⊕3=109 \oplus 3 = 10(二进制为 10101010)。

输入格式

输入由标准输入按照下述格式给出: aa bb CC

输出格式

如果存在满足条件的一对非负整数,选择这样一对 (X,Y)(X, Y) 并按顺序打印 XX 和 YY,中间用一个空格分隔。 如果不存在这样的对,打印 −1-1。

3 4 7
28 27
34 56 998244353
-1
39 47 530423800524412070
540431255696862041 10008854347644927

提示

0≤a≤600 \leq a \leq 60 0≤b≤600 \leq b \leq 60 0 \leq C < 2^{60} 所有输入值均为整数。这一对 (X,Y)=(28,27)(X, Y) = (28, 27) 满足条件。 此处 XX 和 YY 的二进制分别为 1110011100 和 1101111011。

XX 的二进制是 1110011100,所以 popcount⁡(X)=3\operatorname{popcount}(X) = 3。 YY 的二进制是 1101111011,所以 popcount⁡(Y)=4\operatorname{popcount}(Y) = 4。 X⊕YX \oplus Y 的二进制是 0011100111,所以 X⊕Y=7X \oplus Y = 7。

如果存在多对满足条件的非负整数,你可以输出其中任意一对,所以例如输出 424542 45 也会被接受。
不存在满足条件的非负整数对。
注意要输出的值可能无法容纳在 32 位整数中。

标签: AtCoder|abc347D

来源

AtCoder|abc347D