異或的常見問題
一.給定數組的異或和與求和,構造最短非負整數數組。
思路:
1.顯然當無解,就拿兩個數來說,兩個數異或和不可能大於兩數和。
且兩者取等情況當且僅當,兩數取1的位不同。
在考慮奇偶性的情況,當爲奇數時,顯然最低位的1要出現奇數次,
則說明有奇數個奇數,再加上偶數,和肯定爲奇數。
當爲偶數時,顯然最低位的1要出現偶數次,說明偶數個奇數,再加上偶數,和肯定爲偶數。
說明當奇偶性不同時無解。
所以 無解。
2.,若爲空數組。
若,直接輸出即可。
3.情況,顯然我們可以構造一個長度爲的數組。
令有
這時我們還需考慮是否存在長度爲的數組。
這樣的情況當且的每位1不在同一位取得,即.
則答案爲
#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;
}
有時間再更