CF628 D. Ehab the Xorcist(思维+xor)

CF628 D. Ehab the Xorcist(思维+xor)

题目链接

仔细思考应该可以AC的。哎。

本来已经在往哪方面想了。

首先,u,v奇偶性不同是不存在的,u>v也是。

u==v,若都为0,则为空数组。否则,为u.

然后三个数就是最大的了。

令u,x,x   x = (v-u)/2;符合题意。

现在就是要找是否存在两个数的情况,假设存在

则 a+b=a^b+2(a&b) ,很明显。a^b=u,令a&b=x;

则x&u==0,若满足,则答案为u+x,x;

否则数组长度为3,答案为u,x,x;

 

这一场不该啊。。。

#pragma GCC optimize(3 , "Ofast" , "inline")

#include <bits/stdc++.h>

#define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int , int> pi;

template<class T>
inline void read (T &x) {
    x = 0;
    int sign = 1;
    char c = getchar ();
    while (c < '0' || c > '9') {
        if ( c == '-' ) sign = - 1;
        c = getchar ();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar ();
    }
    x = x * sign;
}

const int maxn = 1e6 + 10;
const int inf = int (1e9);
const ll INF = ll (1e18);
const double PI = acos (- 1);
const int mod = 1e9+7;
const double eps = 1e-8;

ll u,v;
int main () {
    read (u);
    read (v);
    if(u>v||u%2!=v%2) {
        puts ("-1");
        return 0;
    }
    if(u==v) {
        if(u==v&&v==0) {
            puts ("0");
            return 0;
        }
        else {
            puts ("1");
            printf ("%lld\n",u);
        }
        return 0;
    }
    ll x = (v-u)/2;
    if(x&u) {
        puts ("3");
        printf ("%lld %lld %lld\n",u,x,x);
    }
    else {
        puts ("2");
        printf ("%lld %lld\n",u+x,x);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值