CodeForces 思维题集锦 #1 - 76D (1700)

原题链接:76D Plus and xor (dp, greedy, math, *1700)

题意简述

给定两个数 A,B,你需要构造出两个数 X,Y,使得 X+Y=AX\operatorname{xor}Y=B 的同时,X 尽量小。

解法分析

一道很 CF 的构造题。

首先,根据异或不进位加法的性质,两个数的异或和不超过它们的和,因此当 A\lt B 时无解。

同样根据不进位加法的性质,我们知道 AB 的奇偶性必定相同,即 A-B 必定为偶数,否则无解,剩余情况均有解。

我们考虑如何构造符合条件的 X,Y 同时 X 尽量小:

如果 XY 有一位二进制位同为 1,则加法后为 10,异或后为 0,将两者的差右移 1,得到 01。我们可以通过这种办法得到 X,Y 中均为 1 的位。因此 \frac{A-B}{2} 的结果就是两数中均为 1 的位。

同时,根据加法和异或的性质,两数同一位上的 01 可以互换。为了让 X 尽量小,我们令 X=\frac{A-B}{2} 即可,可以用 A-X 求出 Y

注意数据范围,需要使用 unsigned long long。

代码

//By: Luogu@rui_er(122461)
#include <bits/stdc++.h>
#define loop while(true)
#define rep(x,y,z) for(ll x=y;x<=z;x++)
#define per(x,y,z) for(ll x=y;x>=z;x--)
#define fil(x,y) memset(x, y, sizeof(x))
using namespace std;
typedef unsigned long long ll;
 
ll a, b, x, y;
 
int main() {
    scanf("%llu%llu", &a, &b);
    if(a < b || (a - b) & 1) return puts("-1"), 0;
    x = (a - b) / 2; y = a - x;
    printf("%llu %llu\n", x, y);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本章主要研究了计算机中无符号数,补码,浮点数的编码方式,通过研究数字的实际编码方式,我们能够了解计算机中不同类型的...
    3561cc5dc1b0阅读 5,521评论 0 0
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,197评论 0 0
  • 1 .A + B 问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。 加减法在底层是使用二...
    Myth52125阅读 2,839评论 0 0
  • 01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例计算机(Compute...
    冰川_阅读 2,361评论 0 1
  • 这里是剑指offer的一些笔记,有几道困难题没做,以后会不上,题解是按照做题序号来的。 数组中重复的数字 新建一个...
    周飞飞飞机阅读 3,077评论 0 0

友情链接更多精彩内容