【构造】【分类讨论】Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor
题意:给你n,x,均不超过10^5,让你构造一个无重复元素的n个元素的非负整数集合(每个元素不超过10^6),使得它们的Xor和恰好为x。
如果x不为0:
随便在x里面找一个非零位,然后固定该位为0,其他位随意填写,恰好弄出n-1个数来,然后对这n-1个数求xor和,记作sum,再输出x xor sum即可。由于只有最后一个数的该位为1,所以必然可以保证不重。
如果x为0:
如果n不能被4整除,那么输出0 ~ n-2,然后记这些数的异或和为sum,再输出(1<<18)|sum,以及1<<18即可。
如果n能被4整除,那么输出1 ~ n-1,然后记这些数的异或和为sum,再输出(1<<18)|sum,以及1<<18即可。
因为记f(x)=0 xor 1 xor ... xor x,则当且仅当x = 3,7,11,15,...时,f(x)=0。
无解当且仅当n=2,且x=0。
#include<cstdio> using namespace std; int n,x; int main(){ scanf("%d%d",&n,&x); if(x!=0){ puts("YES"); int I; for(int i=0;i<=30;++i){ if((x>>i)&1){ I=i; break; } } int sum=0; for(int i=0;i<=n-2;++i){ int now=i; int t=(now^((now>>I)<<I))|((now>>I)<<(I+1)); printf("%d ",t); sum^=t; } printf("%d\n",x^sum); } else{ if(n==1){ puts("YES"); puts("0"); return 0; } if(n==2){ puts("NO"); return 0; } if(n==3){ puts("YES"); puts("1 2 3"); return 0; } if((n-2)%4==0){ puts("YES"); int sum=0; for(int i=1;i<=n-2;++i){ printf("%d ",i); sum^=i; } printf("%d %d\n",(sum|(1<<18)),1<<18); } else{ puts("YES"); int sum=0; for(int i=0;i<n-2;++i){ printf("%d ",i); sum^=i; } printf("%d %d\n",(sum|(1<<18)),1<<18); } } return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/