已知

我们知道与是半加,所以必定满足,并且,固定的时候,当且仅当时,取得最小值。

也就是说:

  1. 的时候,

  2. 的时候,无法满足

  3. 的时候,我们先假设,并且按照二进制位展开:

假设,我们先设,并且按照二进制位展开:

//a
1001001
//b
1001001

要满足,并且要增大,应该怎么做呢?

答案呼之欲出:将a和b中的一个,某个或某几个二进制位上的改成

比如,那么只需要将改成即可。

而题目要求的异或,恰好就是这部分修改的值。也就是说,如果可以满足的话,输出这个差值即可。

最后一部分就是,上是的位,无法再增加了。比如,就要求我们在从右往左数第四位增加,而这是做不到的,所以这种情况也无法满足,输出.

#include <stdio.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", x)
typedef long long ll;
int main() {
    ll T, n, m;
    sc(T);
    while (T--) {
        sc(n), sc(m);
        ll d = n - m * 2;
        if (d < 0 or d & m) pr(-1LL);
        else pr(d);
    }
    return 0;
}

写法较好地使用了位运算,值得参考。