C. Mahmoud and Ehab and the xor
题目链接:http://codeforces.com/problemset/problem/862/C
题目大意:
给你两个数n和x,问存不存在n个互不相同的非负整数满足异或和为x,如果存在输出任意一种
构造方法:
①如果n=1,直接输出x,如果n=2 && x==0输出NO(这是唯一一个无法构造的情况)
②这n个数分别是1, 2, 3, … ,n-1和x123…(n-1),令t=x123…(n-1)
③如果t<1 || t>=n,构造成功
④如果t>=1 && t<n,说明有且只有两个数字重复,删掉这两个数字,输出一个0
⑤但这个时候还缺一个数字怎么办?把1拆成131072和131073或者把2拆成131072和131074即可
代码:
int flag[100005];
int main(void)
{
int n, i, x, p;
scanf("%d%d", &n, &x);
if(n==1)
printf("YES\n%d\n", x);
else if(n==2 && x==0)
printf("NO\n");
else
{
printf("YES\n");
p = -1;
for(i=1;i<=n-1;i++)
x ^= i;
if(x>=1 && x<=n-1)
{
if(x==1)
printf("131072 131074 0"), p = 2;
else
printf("131072 131073 0"), p = 1;
}
else
printf("%d", x);
for(i=1;i<=n-1;i++)
{
if(i!=x && i!=p)
printf(" %d", i);
}
printf("\n");
}
return 0;
}