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-y、x-y、y,随后就是偶数个相同的数
- n 为偶数,输出 x-y、x,输出偶数个相同的数
#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;
}