洛谷 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
",ansx,ansy);
	return 0;
}

原文地址:https://www.cnblogs.com/fusiwei/p/13960554.html