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

传送门

题意:

给两个整数u,v,构造一个数组,使得数组的异或和等于u,数组的和等于v
要求构造的数组尽可能的短

思路:

对于每种情况讨论输出即可,注意几种情况的特判
看代码应该能明白

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
#include <stack>
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int MAXN=1e5+50;
const int inf=0x3f3f3f3f;
const int M=5000*4;
int a[MAXN];
struct sa{
	int x;
	int pos;
}p[MAXN],v[MAXN];
int cmp(sa a,sa b){
	return a.x>b.x;
}
int ans[MAXN];
int main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    ll u,v;
    cin>>u>>v;
    if(u==0&&v==0){
        cout<<0<<endl;
        return 0;
    }
    if(u==v){
        cout<<1<<endl;
        cout<<u<<endl;
        return 0;
    }
    if(u>v||(v-u)%2==1){//异或和大于和,或者两数的差为奇数,就写不出u,t,t这种形式
        cout<<-1<<endl; 
        return 0;
    }
    //一定可以满足,u,t,t一定满足题意,但要求数组尽可能短,看两个是否满足即可
    //数组为2,满足题意就是(u^t)=u+t,或者直接判断((u+t)^t)==u就行
    ll t=(v-u)/2;
    if(((u+t)^t)==u){
        cout<<2<<endl;
        cout<<u+t<<" "<<t<<endl;
    }else{
        cout<<3<<endl;
        cout<<u<<" "<<t<<" "<<t<<endl;
    }
    return 0;
}
/*

*/
发布了169 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44091178/article/details/104876216