Codeforces Round #628 (Div. 2) D. Ehab the Xorcist(异或,思维题)

题意:

寻找异或后值为 u,相加后和为 v 的最短数组。

思路:

异或得 u ,则 v 至少应大于等于 u ,且多出来的部分可以等分为两份相消。

即初始数组为 u , (v-u)/2 , (v-u)/2,之后即为特判或判断是否可以合并。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{    
    ll u,v;cin>>u>>v;

    ll a=(v-u)/2;

    if(v<u||(v-u)%2)
        cout<<"-1";
    else if(u==0)
        cout<<"0";
    else if((u+a+a)==u)
        cout<<"1"<<'
'<<u;
    else if(((u+a)^a)==u)//不会有(u^(a+a))==u,因为此时a+a!=0
        cout<<"2"<<'
'<<u+a<<' '<<a;
    else
        cout<<"3"<<'
'<<u<<' '<<a<<' '<<a;
    
    return 0;
}
原文地址:https://www.cnblogs.com/Kanoon/p/12495687.html