题解 CF76D 【Plus and xor】
CF的思维题,本蒟蒻做了很久,题解没一个看懂的,好不容易A了,自己发一篇吧
这种题肯定要搞二进制吧。
假设我们分别模拟二进制下的加法和乘法。
也就是说,只有二进制位刚好都为1是,异或值和加法值才能不一样。
这个值差了
我们很容易算出加法和异或结果的差,也就是
也就是说,假如有
这一差值是由多个相同位置二进制均为1的数对贡献的。
那么怎么求X和Y的值呢?这就是下一个问题了。
我们不如先去考虑什么时候无解吧
接下来考虑什么时候不成立吧。
很显然,我们的差值需要由
由于
回到刚才的问题
我们可以推导一下,我们要求最小的X,最小的X一定是二进制均为1的最高位。举个例子:
代码:
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
signed main()
{
int a,b;
cin>>a>>b;
if((a-b)&1ull||a-b<0)
puts("-1");
else
cout<<((a-b)>>1ull)<<" "<<(a-((a-b)>>1ull));
return 0;
}