先确认 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;
        }
    }
}