Given the sum and xor of two numbers X and Y s.t. sum and xor , we need to find the numbers minimizing the value of X.
Input : S = 17 X = 13 Output : a = 2 b = 15 Input : S = 1870807699 X = 259801747 Output : a = 805502976 b = 1065304723 Input : S = 1639 X = 1176 Output : No such numbers exist
X ==> XOR of two numbers
S ==> Sum of two numbers
X[i] ==> Value of i-th bit in X
S[i] ==> Value of i-th bit in S
A simple solution is to generate all possible pairs with given XOR. To generate all pairs, we can follow below rules.
- If X[i] is 1, then both a[i] and b[i] should be different, we have two cases.
- If X[i] is 0, then both a[i] and b[i] should be same. we have two cases.
- If X[i] = 0 and A[i] = 0, then a[i] = b[i] = 0. Only one possibility for this bit.
- If X[i] = 0 and A[i] = 1, then a[i] = b[i] = 1. Only one possibility for this bit.
- If X[i] = 1 and A[i] = 0, then (a[i] = 1 and b[i] = 0) or (a[i] = 0 and b[i] = 1), we can pick any of the two.
- If X[i] = 1 and A[i] = 1, result not possible (Note X[i] = 1 means different bits)
- Find the sum of the all amicable numbers up to N
- Find k numbers which are powers of 2 and have sum N | Set 1
- Find the sum of first N odd Fibonacci numbers
- Find XOR of numbers from the range [L, R]
- Find the XOR of first N Prime Numbers
- Find two numbers with sum and product both same as N
- Find the sum of numbers from 1 to n excluding those which are powers of K
- Find original numbers from gcd() every pair
- Find average of two numbers using bit operation
- Program to find LCM of two Fibonnaci Numbers
- Find out the prime numbers in the form of A+nB or B+nA
- Find the GCD of N Fibonacci Numbers with given Indices
- Find the number of divisors of all numbers in the range [1, n]
- Find the count of distinct numbers in a range
- Find two numbers whose divisors are given in a random order
So we generate 2^n possible pairs where n is number of bits in X. Then for every pair, we check if its sum is S or not.
An efficient solution is based on below fact.
S = X + 2*A
where A = a AND b
We can verify above fact using the sum process. In sum, whenever we see both bits 1 (i.e., AND is 1), we make resultant bit 0 and add 1 as carry, which means every bit in AND is left shifted by 1 OR value of AND is multiplied by 2 and added.
So we can find A = (S – X)/2.
Once we find A, we can find all bits of ‘a’ and ‘b’ using below rules.
Let the summation be S and XOR be X.
Below is the implementation of above approach:
a = 15 b = 2
Time complexity of the above approach where b is number of bits in S.
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.