Construct the smallest possible Array with given Sum and XOR
Last Updated :
07 Apr, 2021
Given two positive integers S and X which represents the sum and Bitwise XOR of all the elements of an array arr[]. The task is to find the elements of the array arr[]. If no such array can be generated, print -1.
Examples:
Input: Sum = 4, Xor = 2
Output: {3, 1}
Explanation:
Sum of 1 and 3 is 4.
Bitwise XOR of 1 and 3 is 2.
Input: Sum = 5, Xor = 8
Output: -1
Explanation:
There is no such array exists.
Approach: It can be proven that the maximum length of the array will be at most 3. Let us consider the following cases:
- Case 1: If the given Sum and Bitwise XOR are equal and non-zero, then, that element will be the only element of the required array.
- Case 2: For unequal Sum and Bitwise XOR, the shortest array length can be either 2 or 3.
If the given Bitwise XOR and Sum is a and b respectively, then the shortest array can be {a, (b – a)/2, (b-a)/2 } by using the following two properties of XOR:
- Case 3: When length of array can be 2.
The array we took in the previous case can be reduced to two elements if it is possible.
One important formula helpful here is:-
p + q = (p ^ q) + 2*(p & q)
Substituting values of sum and xor in the above formula we get a very helpful relation.
b = a + 2*(p & q)
(p & q) = (b-a)/2
From previous case,
x = (b-a)/2 = (p & q)
So, now let’s see some relation between a (given xor) and x ((b-a)/2).
p q a=(p^q) x=(p&q) a&x
0 0 0 0 0
0 1 1 0 0
1 0 1 0 0
1 1 0 1 0
- Note: p and q represents all corresponding 32 bits of two numbers in array.
It is important to note that if a & x becomes zero then a + x = a ^ x which means the array will be reduced to {a+x, x} because a+x = a^x. From the above formula, which can still lead to overall XOR as a, and sum will still be b as x is (b-a)/2.
- Case 4: The only case left is to check whether array exists or not. In this case, there are only two condition to check as:
- If Bitwise XOR is greater than the sum.
- If sum and xor have different parities i.e., one is even and other is odd.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findArray( int sum, int xorr)
{
if (xorr > sum
|| sum % 2 != xorr % 2) {
cout << "No Array Possible\n" ;
return ;
}
if (sum == xorr) {
if (sum == 0)
cout << "Array is empty"
<< " with size 0\n" ;
else
cout << "Array size is "
<< 1
<< "\n Array is "
<< sum << "\n" ;
return ;
}
int mid = (sum - xorr) / 2;
if (xorr & mid == 1) {
cout << "Array size is "
<< 3 << "\n" ;
cout << "Array is "
<< xorr << " "
<< mid << " "
<< mid << "\n" ;
}
else {
cout << "Array size is "
<< 2 << "\n" ;
cout << "Array is "
<< (xorr + mid)
<< " "
<< mid << "\n" ;
}
}
int main()
{
int sum = 4, xorr = 2;
findArray(sum, xorr);
cout << "\n" ;
return 0;
}
|
Java
import java.util.*;
import java.io.*;
class GFG{
static void findArray( int sum, int xorr)
{
if (xorr > sum || sum % 2 != xorr % 2 )
{
System.out.println( "No Array Possible" );
return ;
}
if (sum == xorr)
{
if (sum == 0 )
System.out.println( "Array is empty " +
"with size 0" );
else
System.out.println( "Array size is " + 1 );
System.out.println( "Array is " + sum);
return ;
}
int mid = (sum - xorr) / 2 ;
if (xorr == 1 && mid == 1 )
{
System.out.println( "Array size is " + 3 );
System.out.println( "Array is " + xorr +
" " + mid + " " + mid);
}
else
{
System.out.println( "Array size is " + 2 );
System.out.println( "Array is " + (xorr + mid) +
" " + mid);
}
}
public static void main(String[] args)
{
int sum = 4 , xorr = 2 ;
findArray(sum, xorr);
}
}
|
Python3
def findArray(_sum, xorr):
if (xorr > _sum or
_sum % 2 ! = xorr % 2 ):
print ( "No Array Possible" )
return
if (_sum = = xorr):
if (_sum = = 0 ):
print ( "Array is empty" ,
" with size 0" )
else :
print ( "Array size is" , 1 )
print ( "Array is" , _sum)
return
mid = (_sum - xorr) / / 2
if (xorr & mid = = 1 ):
print ( "Array size is" , 3 )
print ( "Array is" , xorr, mid, mid)
else :
print ( "Array size is" , 2 )
print ( "Array is" ,(xorr + mid), mid)
_sum = 4
xorr = 2
findArray(_sum, xorr)
|
C#
using System;
class GFG{
static void findArray( int sum, int xorr)
{
if (xorr > sum || sum % 2 != xorr % 2)
{
Console.WriteLine( "No Array Possible" );
return ;
}
if (sum == xorr)
{
if (sum == 0)
Console.WriteLine( "Array is empty " +
"with size 0" );
else
Console.WriteLine( "Array size is " + 1);
Console.WriteLine( "Array is " + sum);
return ;
}
int mid = (sum - xorr) / 2;
if (xorr == 1 && mid == 1)
{
Console.WriteLine( "Array size is " + 3);
Console.WriteLine( "Array is " + xorr +
" " + mid + " " + mid);
}
else
{
Console.WriteLine( "Array size is " + 2);
Console.WriteLine( "Array is " + (xorr + mid) +
" " + mid);
}
}
public static void Main()
{
int sum = 4, xorr = 2;
findArray(sum, xorr);
}
}
|
Javascript
<script>
function findArray(sum, xorr)
{
if (xorr > sum || sum % 2 != xorr % 2)
{
System.out.println( "No Array Possible" );
return ;
}
if (sum == xorr)
{
if (sum == 0)
document.write( "Array is empty " +
"with size 0" );
else
document.write( "Array size is " + 1);
document.write( " Array is " + sum);
return ;
}
var mid = (sum - xorr) / 2;
if (xorr == 1 && mid == 1)
{
document.write( "Array size is " + 3);
document.write( "Array is " + xorr +
" " + mid + " " + mid);
}
else
{
document.write( "Array size is " + 2);
document.write( "<br>" )
document.write( "Array is " + (xorr + mid) +
" " + mid);
}
}
var sum = 4, xorr = 2;
findArray(sum, xorr);
</script>
|
Output:
Array size is 2
Array is 3 1
Time Complexity: O(1)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...