CodeForces 1325D Ehab the Xorcist(异或和+算数和)

CodeForces 1325D Ehab the Xorcist(异或和+算数和)

http://codeforces.com/contest/1325/problem/D

 

 

 

 

大致题意:

给出两个数a,b,求最短的一组数,使得他们异或和为a,算术和为b。

 

因为 a^t^t=a,所以只要能写成 a+t+t=b 的形式,就满足正确性,所以这组数最多也就3个数。

如果a和t的各个二进制位上,没有一位是两个都是1的(a&t=0),那么按要求最短,这时候就可以把a和t合并成a+t,输出a+t和t这两个数就可以了。

否则,就输出a,t,t三个数。

记得加一些特判,如果a=b=0,直接输出0。如果a=b,直接输出x。如果a>b或者a和b奇偶性不同(一奇一偶),那么就不能写成a+t+t=b的形式,输出-1。

 

 1 #include <bits/stdc++.h>
 2 const int INF=0x3f3f3f3f;
 3 typedef long long LL;
 4 const double eps =1e-8;
 5 const int mod=1e9+7;
 6 const int maxn=1e5+10;
 7 using namespace std;
 8  
 9 int main()
10 {
11     #ifdef DEBUG
12     freopen("sample.txt","r",stdin);
13     #endif
14     
15     LL a,b;
16     scanf("%lld %lld",&a,&b);
17     if( a>b || a&1^b&1 ) printf("-1\n");//判断是否一奇一偶,相当于(b-a)%2
18     else if(a==0 && b==0) printf("0\n");
19     else if(a==b) printf("1\n%lld\n",a);
20     else
21     {
22         LL t=(b-a)/2;
23         if(a&t) printf("3\n%lld %lld %lld\n",a,t,t);
24         else printf("2\n%lld %lld\n",a+t,t);
25     }
26     
27     return 0;
28 }

 

 

tips:https://codeforces.com/blog/entry/74235

-

posted @ 2020-03-15 04:07  jiamian22  阅读(470)  评论(0编辑  收藏  举报