题解 CF76D 【Plus and xor】

· · 题解

题解:

挺有含金量的?我觉得可以评绿。

但是其实推推性质也没啥。

可以看出,^就是不进位加法。

那么它和加法之间会有很多地方相像。具体地,按位来讲,如果两个都是0或者一1一0,加法和异或都是一样的。如果两个都是1的话,那么就会出现加法进位异或变0的情况。

如果这一位为第p位,那么加法就比异或多了2^{p+1}这么多的数。

所以要求最小的x,其实只需要满足这些都是1的位都是1,其他都是0即可。

其解即为(A-B)/2

注意特判无解情况和开unsigned longlong

代码:

#include<cstdio>
#define ull unsigned long long
using namespace std;
ull a,b;
ull ansx,ansy;
int main()
{
    scanf("%llu%llu",&a,&b);
    if(a<b)
    {
        puts("-1");
        return 0;
    }
    if((a-b)&1)
    {
        puts("-1");
        return 0;
    }
    ansx=(a-b)>>1ull;
    ansy=a-ansx;
    printf("%llu %llu\n",ansx,ansy);
    return 0;
}