已知
我们知道与是半加,所以必定满足,并且,固定的时候,当且仅当时,取得最小值。
也就是说:
当的时候,
当的时候,无法满足
当的时候,我们先假设,并且按照二进制位展开:
假设,我们先设,并且按照二进制位展开:
//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; }
写法较好地使用了位运算,值得参考。