题意: 略;
感觉被演了一波,这是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题,没敢想的这么简单.....)