先确认 y 的每个 1 位都包含在 x 里否则无解;n 等于 1 时必须 x 等于 y;n 等于 2 时令 u 等于 x 减 y 并检查 u 非负且 u 与 y 没有公共 1 位并且当 u 为 0 时 y 至少有两位 1,满足则取 u 和 u 异或 y;n 大于等于 3 时把 y 放一项,用一对或两对数把按位或补齐到 x,剩下用成对相同的低位幂填充,这样按位或是 x 且按位异或只剩 y。
void solve(){
int n;ll x,y;cin>>n>>x>>y;
if((y&~x)!=0){
cout<<"NO"<<endl;
return;
}
if(n==1){
if(x==y){
cout<<"YES"<<endl;
cout<<x<<endl;
}else{
cout<<"NO"<<endl;
}
return;
}
if(n==2){
ll u=x-y;
if(u<0||(u&y)!=0){
cout<<"NO"<<endl;
return;
}
if(u==0){
if(__builtin_popcountll(y)==1){
cout<<"NO"<<endl;
return;
}
ll hb=y&-y;
cout<<"YES"<<endl;
cout<<hb<<" "<<(y^hb)<<endl;
return;
}else{
cout<<"YES"<<endl;
cout<<u<<" "<<(u^y)<<endl;
return;
}
}
if(x==y){
if(__builtin_popcountll(x)==1&&n%2==0){
cout<<"NO"<<endl;
return;
}
cout<<"YES"<<endl;
if(n%2==1){
for(int i=0;i<n;++i){
cout<<x<<" ";
}
cout<<endl;
return;
}else{
ll hb=x&-x;
cout<<hb<<" "<<(x^hb);
for(int i=2;i<n;++i){
cout<<" "<<hb;
}
cout<<endl;
return;
}
}else{
cout<<"YES"<<endl;
if(n%2==1){
cout<<y;
for(int i=1;i<n;++i){
cout<<" "<<x;
}
cout<<endl;
return;
}else{
ll hb=x&-x;
ll a=x^hb;
cout<<y<<" "<<a<<" "<<hb;
for(int i=3;i<n;++i){
cout<<" "<<x;
}
cout<<endl;
return;
}
}
}

京公网安备 11010502036488号