Codeforces 1325 D. Ehab the Xorcist

在这里插入图片描述

题意:

给出一个 u u 和一个 v v ,要求构造出最短的一个数组,使得所有元素异或的结果为 u u ,所有元素之和的结果为 v v
异或可以考虑为不进位的加法。

分类讨论一下:

  1. u u v v 都为 0 0 时,答案为 0 0
  2. u = v u=v 时,答案为 u u 或者 v v
  3. u > v u > v 时,答案为 1 -1
  4. 两个相同的数异或值肯定为 0 0 , 0 0 异或任何数又是那个数的本身,所以我们设 a = ( v u ) / 2 a = (v - u) / 2 然后输出 a , a , u a,a,u ,肯定符合。
  5. 如果 ( v u ) % 2 ! = 0 (v - u) \%2!=0 那么肯定是 1 -1
  6. 还有一种长度为 2 2 的情况。 a , a , u a,a,u 合并变成了 a , a + u a,a+u ,这种情况特判即可。

AC代码:

const int N = 2e5 + 10;
ll u, v, x, y, z;

int main()
{
    sldd(u, v);
    if (u == v && v == 0)
    {
        puts("0");
        return 0;
    }
    if (u == v)
    {
        puts("1");
        pld(u);
        return 0;
    }
    if (u > v || (v - u) % 2)
    {
        puts("-1");
        return 0;
    }
    x = (v - u) / 2;
    y = (v + u) / 2;
    if (x + y == v && (x ^ y) == u)
    {
        puts("2");
        pldd(x, y);
        return 0;
    }
    z = (v - u) / 2;
    puts("3");
    plddd(z, z, u);
    return 0;
}

发布了728 篇原创文章 · 获赞 431 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/104873262
今日推荐