E—小苯的数组构造

思路:

首先容易知道 y > x 或者 n=1 && x != y 情况下是 NO

其次如果 x 在二进制下某一位是 0,但是 y 在二进制下这一位是 1,也是 NO

再看 x = y 的情况,还是比较好想的

  • n 为奇数,那么就先输出 x,再随后输出 n-1 个相同的数,n-1 是偶数,所以它们异或结果为 0,最后异或结果为 x

  • n 为偶数,先输出 lowbit(x) 以及 x - lowbit(x),然后又是输出 n-2 个相同的数

x = y 还需要特别注意 x 是 2 的幂且 n 为偶数的情况,这种情况是 NO

如果 x != y,同样要分奇偶

  • n 为奇数,输出 x-yx-yy,随后就是偶数个相同的数
  • n 为偶数,输出 x-yx,输出偶数个相同的数

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=1e9+7;

int T,n,m,k;
void solve(){
	int x,y;
    cin>>n>>x>>y;
    if(x<y || (n==1 && x!=y))
    {
        cout<<"NO\n";
        return ;
    }
    int p=x,q=y;
    while(p&&q)
    {
        if(!(p&1) && (q&1))
        {
            cout<<"NO\n";
            return ;
        }
        p>>=1;
        q>>=1;
    }
    if(x==y)
    {
        if(x==(x&(-x)) && n%2==0)
        {
            cout<<"NO\n";
            return ;
        }
        cout<<"YES\n";
        if(n&1)
        {
            cout<<x;
            for(int i=2;i<=n;i++)cout<<" "<<(x&(-x));
        }
        else
        {
            cout<<(x&(-x))<<" "<<(x-(x&(-x)));
            for(int i=3;i<=n;i++)cout<<" "<<(x&(-x));
        }
        cout<<"\n";
        return ;
    }
    cout<<"YES\n";
    if(n&1)
    {
        cout<<x-y<<" "<<x-y<<" "<<y;
        for(int i=4;i<=n;i++)cout<<" "<<(x&(-x));
    }
    else 
    {
        cout<<x-y<<" "<<x;
        for(int i=3;i<=n;i++)cout<<" "<<(x&(-x));
    }
    cout<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}