異或的常見問題

異或的常見問題

一.給定數組的異或和xx與求和yy,構造最短非負整數數組。

思路:

1.顯然當x>yx>y無解,就拿兩個數來說,兩個數異或和不可能大於兩數和。

且兩者取等情況當且僅當,兩數取1的位不同。

在考慮奇偶性的情況,當xx爲奇數時,顯然最低位的1要出現奇數次,

則說明有奇數個奇數,再加上偶數,和肯定爲奇數。

xx爲偶數時,顯然最低位的1要出現偶數次,說明偶數個奇數,再加上偶數,和肯定爲偶數。

說明當x,yx,y奇偶性不同時無解。

所以x>yx>y 無解。

2.x==yx==y,若x==0x==0爲空數組。

x!=0x!=0,直接輸出xx即可。

3.x<yx<y情況,顯然我們可以構造一個長度爲33的數組。

z=(yx)2,z=\dfrac{(y-x)}{2},zzx=x,z+z+x=yz\oplus z\oplus x=x,z+z+x=y

這時我們還需考慮是否存在長度爲22的數組。

這樣的情況當且z,xz,x的每位1不在同一位取得,即(x&z)==0(x\&z)==0.

則答案爲2,[zx,z]2,數組爲[z\oplus x,z]

CF628D

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,inf=0x3f3f3f3f;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first 
#define se second
int main(){
    ll x,y;
    scanf("%lld%lld",&x,&y);
        if(x%2!=y%2||x>y) puts("-1");
        else {
            if(x==y)
                printf(!x?"0\n":"1\n%lld\n",x);
            else {
                ll z=(y-x)/2;
                if(!(z&x)) printf("2\n%lld %lld\n",z^x,z);
                else  printf("3\n%lld %lld %lld\n",z,z,x);
            }
        }
	return 0;
}

有時間再更\dots\dots

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章