CF862C Mahmoud and Ehab and the xor 题解

Codeforces
Luogu

Description.

给你一个数 \(x\) 问你能不能分解成 \(n\) 个互不相同的数,使得这 \(n\) 个数的异或和为 \(x\)。

Solution.

Corner Case 太多了 CF862C Mahmoud and Ehab and the xor 题解
首先,一眼秒,直接前前 \(n-2\) 个是 \(i\),然后最后两个是 \(x\oplus 2^{17}\oplus \bigoplus_{i=1}^{n-2}i\) 和 \(2^{17}\) 就行了。
然后 WA,发现 \(n=1\) 的 corner case。
然后 WA,发现 \(x=\bigoplus_{i=1}^{n-2}i\) 的 corner case。
就考虑如果 \(x=\bigoplus_{i=1}^{n-2}i\),那肯定要把倒数第三个拉入伙来修改。
然后 WA,发现 \(x=\bigoplus_{i=1}^{n-2}i\) 且 \(n=2\) 的无解情况。
然后 AC。

Coding.

点击查看 /jk 代码
//是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
int a[100005];
int main()
{
	int n,x;read(n,x);if(n==2&&!x) return puts("NO"),0;
	puts("YES");if(n==1) return printf("%d\n",x),0;
	for(int i=1;i<n-1;i++) a[i]=i,x^=i;
	if(!x) a[n]=x,a[n-1]^=1<<18,a[n-2]^=1<<18|1<<19,a[n]^=1<<19;
	else a[n]=x,a[n]^=1<<18,a[n-1]^=1<<18;
	for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
	return 0;
}
上一篇:[abc] B - typo 直接模拟


下一篇:变量作用域