B.MEXor Mixup
题意:
给你两个整数a,b,构造一个长度最小的数组,该数组满足的要求是:
1.MEX(不属于数组中最小的正整数)等于a
2.数组中所有元素异或和等于b
输出构造数组的最小长度。
思路:
1.a是不属于数组中最小的正整数,所以数组至少是
先求~的异或和。
方法一:预处理异或和,否则会超时
方法二:每两个连续数字就出现一个1,所以每四个连续的数字就会出现一个0。
if(a%4==0) ans=0;
else if(a%4==1) ans=a-1;
else if(a%4==2) ans=1;
else if(a%4==3) ans=a;
2.是~异或和后的值。
如果,则(不需要再添加元素)
如果^,则(新添加的元素ans^b不与第一个条件冲突,ans^ans^b==b)
其他情况。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,a,b;
cin>>t;
while(t--)
{
cin>>a>>b;
int ans=0;
if(a%4==0)
ans=0;
else if(a%4==1)
ans=a-1;
else if(a%4==2)
ans=1;
else if(a%4==3)
ans=a;
if(ans==b)
cout<<a<<endl;
else if((ans^b)!=a)
cout<<a+1<<endl;
else
cout<<a+2<<endl;
}
}