Codeforces Round #628 (Div. 2)] D-Ehab the Xorcist
题意:
给定两个整数
让你构造一个长度最小的数组,使其:
1、
2、
不存在这个数组就输出“-1”。
思路:
先考虑不存在的情况:
1、当时,一定不存在,因为异或是不进位的加法,不可能一群数异或起来比加起来还大。
2、奇偶性不一样,考虑异或运算和加法运算的对最低位的影响是相同的(因为没有位置给最低位进位)。
然后都是存在解的情况:
也是分情况讨论:
1、当,如果,那么空数组就可以满足条件,否则构造一个的数组即可。
2、令,即异或运算不进位时的损失值,
如果的二进制与等于0,那么答案为:
否则答案为:
代码:
int main() { //freopen("D:\\code\\text\\input.txt","r",stdin); //freopen("D:\\code\\text\\output.txt","w",stdout); ll x, y; while (~scanf("%lld %lld", &x, &y)) { if (x > y) { printf("-1\n"); } else { if (x == y) { if (x == 0) printf("0\n"); else { printf("1\n"); printf("%lld\n", x); } } else { ll c = y - x; if (c & 1) { printf("-1\n"); } else { ll z = c / 2; if ((z & x) == 0) { printf("2\n"); printf("%lld %lld\n", x + c / 2, c / 2 ); } else { printf("3\n"); printf("%lld %lld %lld\n", x, c / 2, c / 2 ); } } } } } return 0; }