CodeForces 思維題集錦 #1 - 76D (1700)

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

題意簡述

給定兩個數(shù) A,B,你需要構(gòu)造出兩個數(shù) X,Y,使得 X+Y=AX\operatorname{xor}Y=B 的同時,X 盡量小。

解法分析

一道很 CF 的構(gòu)造題。

首先,根據(jù)異或不進位加法的性質(zhì),兩個數(shù)的異或和不超過它們的和,因此當 A\lt B 時無解。

同樣根據(jù)不進位加法的性質(zhì),我們知道 AB 的奇偶性必定相同,即 A-B 必定為偶數(shù),否則無解,剩余情況均有解。

我們考慮如何構(gòu)造符合條件的 X,Y 同時 X 盡量?。?/p>

如果 XY 有一位二進制位同為 1,則加法后為 10,異或后為 0,將兩者的差右移 1,得到 01。我們可以通過這種辦法得到 X,Y 中均為 1 的位。因此 \frac{A-B}{2} 的結(jié)果就是兩數(shù)中均為 1 的位。

同時,根據(jù)加法和異或的性質(zhì),兩數(shù)同一位上的 01 可以互換。為了讓 X 盡量小,我們令 X=\frac{A-B}{2} 即可,可以用 A-X 求出 Y。

注意數(shù)據(jù)范圍,需要使用 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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章主要研究了計算機中無符號數(shù),補碼,浮點數(shù)的編碼方式,通過研究數(shù)字的實際編碼方式,我們能夠了解計算機中不同類型的...
    3561cc5dc1b0閱讀 1,711評論 0 0
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 4,902評論 0 0
  • 1 .A + B 問題 給出兩個整數(shù)a和b, 求他們的和, 但不能使用 + 等數(shù)學(xué)運算符。 加減法在底層是使用二...
    Myth52125閱讀 438評論 0 0
  • 01.01_計算機基礎(chǔ)知識(計算機概述)(了解) A:什么是計算機?計算機在生活中的應(yīng)用舉例計算機(Compute...
    冰川_閱讀 347評論 0 1
  • 這里是劍指offer的一些筆記,有幾道困難題沒做,以后會不上,題解是按照做題序號來的。 數(shù)組中重復(fù)的數(shù)字 新建一個...
    周飛飛飛機閱讀 471評論 0 0

友情鏈接更多精彩內(nèi)容