1. 程式人生 > 其它 >codeforces #742 C.MEXor Mixup

codeforces #742 C.MEXor Mixup

codeforces #742 C.MEXor Mixup

題目大意:

​ 有一個未知的陣列x,給定a和b。a表示陣列x中不包含的最小數,b表示陣列x中所有數異或的結果 。

思路:

​ a是x不包括的最小,所以[0,a-1]一定是在這個陣列x中的 。

​ 將這a個數異或起來可以得到一個數y。

​ 總能找到一個數z,使得y^z==b。所以最後的答案就是a+1 。

​ 但是,如過這個z恰好等於a,就是說a存在於陣列x中,這就和a是最小不屬於元素矛盾。所以需要另外找兩個數u,v,使得u^v==a。所以答案變成了a+2

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 2*1e8+10;

ll f[300050] ;

ll solve(){
	ll a , b , t, ans;
	cin>>a>>b;
	t = f[a - 1] ;//a的字首異或(不包括a)
	ans = a ;
	if(t == b)return ans; //t剛好等於b就不用再加數了
	
	if((t^a) == b)return ans + 2;//t如果要異或a才等於b就要再找兩個不是a的數uv
    							 //使得u^v=a
	return ans + 1 ;//找一個非a的數
}

int main(){
	ios::sync_with_stdio(false);
	ll T;
	cin>>T;
    //要將前a個數異或起來,如果每次詢問的時候去做會很浪費時間
    //所以做一個字首異或陣列f,如下:
	for(ll i = 1 ; i <= 300030 ; i ++){
		f[i] = i ^ f[i - 1] ;
	}
	while(T -- ){
		cout<<solve()<<"\n";
	}
}