1325 D. Ehab the Xorcist

题意:

给两个数字 u,v 求一个最短的数组 {ai} 使得数组内所有数字异或的结果为u 且和为v

思路:

分情况讨论一下

  • 显然v>u的情况下无解输出 -1,再思考一下发现 u 和 v 不具有相同的奇偶性时同样无解
  • u==v,输出u即可(特例:u==0时数组长度为0)
  • 考虑到 x xor x == 0,可以输出 u xor (v - u)/2 xor (v - u)/2,其中两个(v - u)/2异或相抵消
  • 题目要求输出最短的数组,这时可以考虑到如果在二进制位上 u 和 (v - u)/2 没有在同一个位置的 1,有 u xor (v - u)/2 == u + (v - u)/2,则可以把上一条中的前两个数字 u,(v - u)/2 合并,此时答案是长度为 2 的数组 u + (v - u)/2,(v - u)/2

code

#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);

    long long u, v;

    cin >> u >> v;
    if (u > v || (v - u) & 1) cout << -1 << endl;
    else if (u == v) {
        if (u == 0) cout << 0 << endl;
        else cout << 1 << endl << u << endl;
    } else {
        long long x = (v - u) >> 1;
        if (u + x == (u ^ x)) cout << 2 << endl << u + x << ' ' << x << endl;
        else cout << 3 << endl << u << ' ' << x << ' ' << x << endl;
    }

    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,148评论 0 2
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,786评论 0 5
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,995评论 0 13
  • MySQL5.6从零开始学 第一章 初始mysql 1.1数据库基础 数据库是由一批数据构成的有序的集合,这些数据...
    星期四晚八点阅读 1,255评论 0 4
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,550评论 0 19

友情链接更多精彩内容