传送门
给两个整数u,v,构造一个数组,使得数组的异或和等于u,数组的和等于v 要求构造的数组尽可能的短
对于每种情况讨论输出即可,注意几种情况的特判 看代码应该能明白
#include #include #include #include #include #include #include #include #include #include #define pb push_back #define lb lower_bound #define ub upper_bound #define rep(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<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; } /* */
CodeForces 异或 round div
帮助他人,成就自己。
人生最大成功就是伸出热情而温暖的双手,尽自己所能去帮助身边的每一个人,只要无私的奉献,就会收获到美好的生活。
1024问感谢每一位朋友的帮助和支持。