求调刚才 CF 的 C
  • 板块学术版
  • 楼主huangkx
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/10 21:47
  • 上次更新2023/10/24 04:49:26
查看原帖
求调刚才 CF 的 C
232838
huangkx楼主2023/1/10 21:47
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
void solve()
{
	unsigned long long n, x, N; scanf("%lld%lld", & n, & x); N = n;
	if(n == x){
		printf("%lld\n", n);
		return;
	}
	bool flag = 0; int p = - 1, i = 0;
	while(n || x){
		if(! (n & 1ll) && (x & 1ll)){
			puts("-1");
			return;
		}else if((n & 1ll) && (x & 1ll)){
			flag = 1;
		}else if((n & 1ll) && ! (x & 1ll)){
			if(flag){
				puts("-1");
				return;
			}else{
				p = i;
			}
		}
		n >>= 1ll, x >>= 1ll, i ++;
	}
	printf("%lld\n", (N & (~ ((1ll << (p + 1ll)) - 1ll))) + (1ll << (p + 1ll)));
}
int main()
{
	int t; scanf("%d", & t);
	while(t --) solve();
	return 0;
}
/*
如果 n 中有 0 在 x 中是 1,则无解
如果 n 中最左一个在 x 中是 0 的 1 的右边有 1 在 x 中是 1,则无解
m 为 n 把最左一个在 x 中是 0 的 1 的右边和它自己全部置 0 后,把它左边第一位 +1 的数
*/
2023/1/10 21:47
加载中...