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
-