二进制构造Codeforces Round #628 (Div. 2) D. Ehab the Xorcist
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制构造Codeforces Round #628 (Div. 2) D. Ehab the Xorcist相关的知识,希望对你有一定的参考价值。
题意:
给两个数u
和v
,u
为数组中元素的异或,v
为数组中元素的和,求满足条件的最小长度的数组
思路:
二进制构造一般是利用了巧妙的公式或者某二进制位几个数之间的特定关系进行构造。
我们考虑寻找与题目相关的公式。
从简单的式子开始想:
假设两个数a
和b
, a + b = v , a ⊕ b = u a+b=v,a \\oplus b=u a+b=v,a⊕b=u,寻找这两个式子之间的公式,可以通过列举二进制位进行推导
a
+
b
=
a
⊕
b
+
?
1
1
=
0
+
?
1
0
=
1
+
?
0
1
=
1
+
?
0
0
=
0
+
?
a+b = a \\oplus b \\ +\\ ?\\\\ 1\\ 1 = 0 + ? \\\\ 1 \\ 0 = 1 + ?\\\\ 0 \\ 1 = 1 + ? \\\\ 0 \\ 0 = 0 + ?
a+b=a⊕b + ?1 1=0+?1 0=1+?0 1=1+?0 0=0+?
可以发现?
处填
2
∗
(
a
&
b
)
2*(a \\&b)
2∗(a&b)满足式子
可以得到
a
+
b
=
a
⊕
b
+
2
∗
(
a
&
b
)
a+b = a \\oplus b + 2*(a\\&b)
a+b=a⊕b+2∗(a&b)
进而令
x
=
a
&
b
=
v
−
u
2
x = a\\&b = \\frac{v-u}{2}
x=a&b=2v−u
x
为已知结果,可以试着对单一二进制的位进行讨论,看是否有些结论
对于单个二进制位来说,对x二进制位进行讨论
x = a & b x=a\\&b x=a&b | 1 | 0 | 0 | 0 |
---|---|---|---|---|
a a a | 1 | 0 | 1 | 0 |
b b b | 1 | 1 | 0 | 0 |
u = a ⊕ b u=a \\oplus b u=a⊕b | 0 | 1 | 1 | 0 |
可以发现a
和b
涵盖了所有的可能情况,随便构造两个数就行(必须包含x
这个数,因为是用x
推导的),只要满足一个式子,另一个式子就可以满足。
然后找这种情况的特征:
x
&
u
=
0
x\\& u=0
x&u=0,这时候就可以构造两个数
出现
x
&
u
=
1
x\\&u=1
x&u=1怎么办?这时候需要一点敏感度了,x
和u
的位必须都为1,结果是u
,可以根据x
的式子发现x
,x
,u
刚好满足结果,即为答案
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 2e5+5,M = 2e5+5;
int n,m,k;
ll u,v;
void solve()
{
cin>>u>>v;
if(u>v or u%2!=v%2)
{
cout<<-1<<'\\n';
return ;
}
if(u==v)
{
if(u==0) cout<<0<<'\\n';
else
{
cout<<1<<'\\n';
cout<<u<<'\\n';
}
return ;
}
ll x = (v-u)/2;
if(u&x)
{
cout<<3<<'\\n';
cout<<x<<" "<<x<<" "<<u<<'\\n';
}
else
{
cout<<2<<'\\n';
cout<<x<<" "<<v-x<<'\\n';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int _;
// cin>>_;
_ = 1;
while(_--)
{
solve();
}
return 0;
}
以上是关于二进制构造Codeforces Round #628 (Div. 2) D. Ehab the Xorcist的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 62
Codeforces Global Round 1 CMeaningless Operations
Educational Codeforces Round 62 (Rated for Div. 2)
Educational Codeforces Round 62 做题记录
C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列