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;
}