time limit per test
2 seconds
memory limit per test
256 megabytes
Alice gave Bob two integers a and b (a>0 and b≥0). Being a curious boy, Bob wrote down an array of non-negative integers with MEX value of all elements equal to a and XOR value of all elements equal to b.
What is the shortest possible length of the array Bob wrote?
Recall that the MEX (Minimum EXcluded) of an array is the minimum non-negative integer that does not belong to the array and the XOR of an array is the bitwise XOR of all the elements of the array.
Input
The input consists of multiple test cases. The first line contains an integer t (1≤t≤5⋅104) --- the number of test cases. The description of the test cases follows.
The only line of each test case contains two integers a and b (1≤a≤3⋅105; 0≤b≤3⋅105) --- the MEX and XOR of the array, respectively.
Output
For each test case, output one (positive) integer --- the length of the shortest array with MEX a and XOR b. We can show that such an array always exists.
Example
Input
Copy
5
1 1
2 1
2 0
1 10000
2 10000
Output
Copy
3
2
3
2
3
Note
In the first test case, one of the shortest arrays with MEX 1 and XOR 1 is [0,2020,2021].
In the second test case, one of the shortest arrays with MEX 2 and XOR 1 is [0,1].
It can be shown that these arrays are the shortest arrays possible.
解题说明:此题是一道数学题,采用异或运算,可以先预处理一下,求出所有30000以下数字的异或值,MEX为a,即小于a的数都得出现,所以可以先将他们XOR起来。然后如果这些数的异或已经等于b了,那最小长度就是a,如果不等于,那么只要在找一个数,就可以异或得到b,长度为a+1,但如果这个数恰好等于a,就需要再找两个数,是这两个数异或等于a,长度为a+2。
cpp
#include <stdio.h>
#include <string.h>
int a[300030];
int main()
{
int t;
scanf("%d", &t);
int i;
for (i = 1; i < 300030; i++)
{
a[i] = a[i - 1] ^ i;
}
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
if (m == a[n - 1])
{
printf("%d\n", n);
}
else if (m == a[n])
{
printf("%d\n", n + 2);
}
else
{
printf("%d\n", n + 1);
}
}
return 0;
}