【构造】【分类讨论】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;
}
posted @ 2017-09-20 01:14  AutSky_JadeK  阅读(142)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト