题目大意
给你两个数 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; } } }