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,无答案,除非两个相同的数才能^出0,
如果N=2,X不等于0,用0和X做答案即可,0^X=X
N>3时,用两个很大的数(用很大的数是为了前面能够用小的数凑到N),假设为a,b(题目要求N不超过10的5次方,所以a,b超过10的5次方即可)
两个数进行^ ,再^X,再异或两个数,还是X
,多余的数用一个循环找出来
例如:0 ^ 1 ^ 2 ^ a ^b ^ a ^ b ^x ^ 0 ^ 1 ^ 2=x


 #include <bits/stdc++.h>

using namespace std;

int main(){
//	printf("%d",3<<18);
	int n, x;
	cin>>n>>x;
	if (n == 1){
		cout <<"YES" << endl << x;
	}
	else 
		if (n == 2 && x == 0)
			cout<<"NO"<<endl;
		else 
			if (n == 2)	{
				cout<<"YES"<<endl << x <<" "<<0<<endl;;
			}
			else{
				cout<<"YES"<<endl;
				for (int i = 0; i < n - 3; i++)	{
					x ^= i;
					cout<<i<<" ";
				}
				int a = (3 << 18);
				int b = a/2;
				cout<<a<<" "<<b<<" "<<(a^b^x)<<endl;
			}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值