• 【构造】【分类讨论】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
    ",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
    ",(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
    ",(sum|(1<<18)),1<<18);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    四、java IO--使用字节流拷贝文件
    三、java IO--使用字节流写入文件
    二、java IO--使用字节流读取文件
    一、java--IO概念
    xml解析/读取--dom4j
    java程序执行顺序
    Flask学习——cookie操作
    Linux13 shell函数、数组及awk、awk中的数组
    Linux12 RPM 和yum的使用
    Linux11 IP网段划分及主机接入网络
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7555238.html
Copyright © 2020-2023  润新知