Codeforces Round #742 (Div. 2)–B. MEXor Mixup
思路
-
首先知道确定一个异或的数a和异或后的值x满足a^b=x,那么有且只有一个b满足该等式
-
数组的最小长度肯定是大于等于a的,所以先让ans=a
-
首先初始化将1到n的异或的值全都筛选出来保存到一个数组中
-
如果异或的值等于b的话,那么答案就是a,否则,将得到的值与数组中没有出现的最小值(也就是a)异或,假如得到的值等于k,那么ans=n+2,否则ans=n+1
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[300005];
int init(){
for(int i=0;i<300005;i++){
a[i+1]=a[i]^i;
}
}
int main() {
init();
int t;cin>>t;
while(t--){
int n,k;cin>>n>>k;
int ans=n;
int x=a[n];
if(x==k)ans=n;
else{
if((x^n)==k)ans++;
ans++;
}
cout<<ans<<endl;
}
}