「D. Ehab the Xorcist」

题目大意

给你两个数 u v,要求找出一个数组,里面的元素满足几个条件 

元素之和==v

元素之异或==u

做法

三个数:

根据u^0==u  同时知道两个相同的数异或为0 ,可以把0换成(v-u)/2 和 (v-u)/2 ;因此,最多只需要三个数(v-u)/2,(v-u)/2,u;

两个数:

把上边的三个元素种的u和其中一个(v-u)/2合并 就得到了两个数,(v-u)/2,(v+u)/2可知如果这连个数字满足要求那么就只需要两个数。

特判:

当u==v&&v!=0 输出v 

当u==v&&v==0输出0

当(v-u)%2||v<u输出-1;

http://codeforces.com/contest/1325/problem/D传送门

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long u,v;
    cin>>u>>v;
    if(u==v&&v!=0){
        cout<<1<<endl<<v<<endl;
    }
    else if(u==v&&v==0){
        cout<<0<<endl;
    }
    else if((v-u)%2||v<u){
        cout<<-1<<endl;
    }
    else {
        if((((v-u)/2)^((v+u)/2))==u){
            cout<<2<<endl;
            cout<<(v-u)/2<<" "<<(v+u)/2<<endl;
        }
        else{
            cout<<3<<endl;
            cout<<u<<" "<<(v-u)/2<<" "<<(v-u)/2<<endl;
        }
    }
} 

 

posted @ 2020-03-16 12:49  _LH2000  阅读(159)  评论(0编辑  收藏  举报