CF862C Mahmoud and Ehab and the xor 题解
Link.
Description.
给你一个数 \(x\) 问你能不能分解成 \(n\) 个互不相同的数,使得这 \(n\) 个数的异或和为 \(x\)。
Solution.
Corner Case 太多了
首先,一眼秒,直接前前 \(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;
}