D. Ehab the Xorcist

题意: 略;

感觉被演了一波,这是CFdiv2吗?

算是这个构造题吧。

1 首先我们可以将u进行二进制拆分来考虑。加入u>v那么小与v的那些数在怎么拼接也无法使异或值为u。

比如二进制U=1 0 1 1 0。怎么才能异或成这个数呢?无非就是让1所在的位置的1的个数为奇数就行了,也就是构成异或成U的最小值为1000+100+10。如果大于v的话是不可能构成U的。

2 v>u&&(v-u)&1。这样的话最后一位置会多出来一个1,会改变异或值的奇偶性,与u相反,所以也是不可能的。

3 v==u&&v=0 :略。

4 v==u&&v!=0:   略。

5 构造 :

  u+x+x=v。u^x^x==u。

所以x=(v-u)/2。

u,(v-u)/2,(v-u)/2。

将u和(v-u)/2合并一下,如果满足条件,那么可以优化为 (v+u)/2,(v-u)/2。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
    ll u,v;
    cin>>u>>v;
    if(u>v||(v-u)&1) {
        cout<<-1<<endl;
        return ;
    }
    if(u==v&&u==0) {
        cout<<0<<endl;
        return ;
    }
    if(u==v&&u!=0){
        cout<<1<<endl;
        cout<<v<<endl;
        return ;
    }
    ll c=(u+v)/2;
    ll b=(v-u)/2;
    if((c^b)==u){
        cout<<2<<endl;
        cout<<b<<" "<<c<<endl;
    }
    else {
        cout<<3<<endl;
        cout<<u<<" "<<b<<" "<<b<<endl;
    }
}


int  main()
{
    solve();
    
    return 0;
}

(吐槽:觉得是D题,没敢想的这么简单.....)

原文地址:https://www.cnblogs.com/Accepting/p/12512932.html