洛谷 U140112 Seawayson的趣味题
洛谷 U140112 Seawayson的趣味题
题目背景
SeawaySeawa**y博士是MT(我叫MT,一款游戏)领域的知名专家,他的儿子名叫SeawaysonSeawayson。现在,刚刚放学回家的SeawaysonSeawayson正在思考一个有趣的问题。
题目描述
今天在信息学课堂上,老师讲解了关于进制的知识。老师向他们介绍了二进制以及二进制的一些常用运算。卷帙浩繁中,SeawaysonSeawayson对0101串、按位与、按位或等操作情有独钟。现在SeawaysonSeawayson认为自己已经熟练地掌握了这些知识,他开始思考一些更加有趣的问题。这个问题被他命名为“最小异或和”问题。这个问题是这样的:SeawaysonSeawayson先给定两个整数A,BA,B,他想要找到两个满足条件的整数x,yx,y,满足x,yx,y是A,BA,B的“最小异或和”。在本题中,“最小异或和”按如下方式定义:
对于整数P,QP,Q及两个整数M,NM,N。若满足P=M+N,Q=M\ xor\ NP=M+N,Q=M xor N。且MM是所有满足条件的整数中最小的,则称M,NM,N为P,QP,Q的最小异或和。
SeawaysonSeawayson在稍加思索后,他发现这样的解可能不存在。因此他请你帮助他编程求解这个问题。
输入格式
从文件seawayson.inseawayson.i**n中读入数据。
第一行一个整数TT,表示测试数据组数。
每组数据包括一行两个整数A,BA,B。意义如题目描述所示。
输出格式
输出到文件seawayson.outseawayson.out中。
对于每组数据:
若有解,输出两个用空格分开的整数x,yx,y;若无解,输出I \ love \ SeawayI lov**e Seawa**y。每组数据间换行。
命题背景:
如果严格按难度排,这题应该放T1。但是我就是觉得这个玩意比大模拟要难一些。而且大模拟还要留着搞选手心态呢所以放了T2。
题解:
感觉思维难度的确是有的。
挺有含金量的?我觉得可以评绿。
但是其实推推性质也没啥。
可以看出,^就是不进位加法。
那么它和加法之间会有很多地方相像。具体地,按位来讲,如果两个都是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;
}