Codeforces Round #628 (Div. 2) D. Ehab the Xorcist(异或构造,思维)

Nita ·
更新时间:2024-09-20
· 800 次阅读

传送门

题意:

给两个整数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; } /* */
作者:_Alexander



CodeForces 异或 round div

需要 登录 后方可回复, 如果你还没有账号请 注册新账号