Open In App

Check if it is possible to construct an Array of size N having sum as S and XOR value as X

Improve
Improve
Like Article
Like
Save
Share
Report

Given three numbers N, S and X the task is to find if it is possible to construct a sequence A of length N, where each A[i] >= 0 for 1<=i<=N and the sum of all numbers in a sequence is equal to S, and the bit-wise XOR of sequence equals to X.

Examples:

Input: N = 3, S = 10, X = 4 
Output: Yes
Explanation: One of the sequence possible is {4, 3, 3} where sum equals 10 and XOR equals 4

Input: N = 1, S = 5, X = 3
Output: No

 

Approach: Lets consider the following test cases. 

Case-1: When N equals 1 it can be easily seen that when (S equals X) then only return “Yes” otherwise “No“. 

Case-2: When N is greater than equal to 3, use the formula (a + b) = (a xor b) + 2(a and b) Here it can be seen that (a + b) = S and (a xor b) = X so equation becomes S = X + 2(a.b). Therefore, (S-X) should be even because on right side we have 2(a.b). So, it can be said that is S is odd then X is odd  and if S is even then X is even then only, (S-X) is also even which can be checked by (S%2 == X%2) also S >= X otherwise A.B turns negative Which is not possible. 

Case-3: For the case N equals 3, it is something like  A + B + C =  S  and A^B^C = X. Use the property A^A = 0 and  0^A = A => X + ( S – X)/2 + (S – X)/2 =  X + (S-X) => X + ( S – X)/2 + (S – X)/2 =  S and also this way: X ^( (S – X)/2 ^ (S-X)/2 ) = X ^ 0 = X. Hence, it is proved that for N == 3 there will always be such sequence and we can just return “Yes“. 

Case-4: When N == 2 and  (S%2 == X%2) and S >= X, assume  A + B == S  and (A^B) == X then ( A and B) == (S-X)/2  From the equation discussed above. Let C = A.B. On observing carefully it can be noticed that the bits of C are “1” only when A and B bits are “1” for that position and off otherwise. And X that is xor of A, B has on bit only when there are different bits that is at ith  position A has ‘0’ and B has ‘1’ or the just opposite: So looking at this sequence, assign every bits into variable A and B, C = ( S – X)/2. Assign A and B from C -> A = C, B = C

Now add the X into A or B to assign all the ones into A and all zero to B so when we XOR both numbers then the added ‘1’ bits into A will just be opposite to what we added into B that is ‘0’. The fun part is when set bits of C coincides with some set bits of X then it will not give the desired xor of X, Now, A = C  + X, B = C. Now A+B = ( C + X) + C =  S and when XOR A.B equals X then it can be sure that there exist such pair when A + B == S  and (A^B) == X;

Follow the steps below to solve the problem:

  • If S is greater than equal to X, and S%2 is equal to X%2 then perform the following steps, else return No.
    • If n is greater than equal to 3, then return Yes.
    • If n equals 1, and if S equals X, then return Yes else return No.
    • If n equals to 2, initialize the variable C as (S-X)/2 and set variables A and B as C and add the value X to the variable A and if A^B equals X, then print Yes else print No.

Below is the implementation of the above approach.

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find if any sequence is
// possible or not.
string findIfPossible(int N, int S, int X)
{
    if (S >= X and S % 2 == X % 2) {
 
        // Since, S is greater than equal to
        // X, and either both are odd or even
        // There always exists a sequence
        if (N >= 3) {
            return "Yes";
        }
        if (N == 1) {
 
            // Only one case possible is
            // S == X or NOT;
            if (S == X) {
                return "Yes";
            }
            else {
                return "No";
            }
        }
 
        // Considering the above conditions true,
        // check if XOR of S^(S-X) is X or not
        if (N == 2) {
 
            int C = (S - X) / 2;
            int A = C;
            int B = C;
            A = A + X;
            if (((A ^ B) == X)) {
                return "Yes";
            }
            else {
                return "No";
            }
        }
    }
    else {
        return "No";
    }
}
 
// Driver Code
int main()
{
 
    int N = 3, S = 10, X = 4;
 
    cout << findIfPossible(N, S, X);
 
    return 0;
}


C




// C program for the above approach
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
// Function to find if any sequence is
// possible or not.
char* findIfPossible(int N, int S, int X)
{
    if (S >= X && S % 2 == X % 2) {
 
        // Since, S is greater than equal to
        // X, and either both are odd or even
        // There always exists a sequence
        if (N >= 3) {
            return "Yes";
        }
        if (N == 1) {
 
            // Only one case possible is
            // S == X or NOT;
            if (S == X) {
                return "Yes";
            }
            else {
                return "No";
            }
        }
 
        // Considering the above conditions true,
        // check if XOR of S^(S-X) is X or not
        if (N == 2) {
 
            int C = (S - X) / 2;
            int A = C;
            int B = C;
            A = A + X;
            if (((A ^ B) == X)) {
                return "Yes";
            }
            else {
                return "No";
            }
        }
    }
    else {
        return "No";
    }
}
 
// Driver Code
int main()
{
 
    int N = 3, S = 10, X = 4;
    printf("%s\n", findIfPossible(N, S, X));
    return 0;
}
 
// This code is contributed by phalasi.


Java




// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to find if any sequence is
    // possible or not.
    static void findIfPossible(int N, int S, int X)
    {
        if ((S >= X) && (S % 2 == X % 2)) {
 
            // Since, S is greater than equal to
            // X, and either both are odd or even
            // There always exists a sequence
            if (N >= 3) {
                System.out.println("Yes");
            }
            if (N == 1) {
 
                // Only one case possible is
                // S == X or NOT;
                if (S == X) {
                    System.out.println("Yes");
                }
                else {
                    System.out.println("No");
                }
            }
 
            // Considering the above conditions true,
            // check if XOR of S^(S-X) is X or not
            if (N == 2) {
 
                int C = (S - X) / 2;
                int A = C;
                int B = C;
                A = A + X;
                if (((A ^ B) == X)) {
                    System.out.println("Yes");
                }
                else {
                    System.out.println("No");
                }
            }
        }
        else {
            System.out.println("No");
        }
    }
 
    // Driver code
    public static void main(String args[])
    {
        int N = 3, S = 10, X = 4;
 
        findIfPossible(N, S, X);
    }
}
 
// This code is contributed by code_hunt.


Python3




# Python program for the above approach
# Function to find if any sequence is
# possible or not.
 
 
def findIfPossible(N,  S,  X):
 
    if (S >= X and S % 2 == X % 2):
        # Since, S is greater than equal to
        # X, and either both are odd or even
        # There always exists a sequence
        if (N >= 3):
            return "Yes"
 
        if (N == 1):
 
            # Only one case possible is
            # S == X or NOT
            if (S == X):
                return "Yes"
            else:
                return "No"
 
        # Considering the above conditions true,
        # check if XOR of S^(S-X) is X or not
        if (N == 2):
            C = (S - X) // 2
            A = C
            B = C
            A = A + X
            if (((A ^ B) == X)):
                return "Yes"
            else:
                return "No"
    else:
        return "No"
 
 
# Driver Code
N = 3
S = 10
X = 4
 
print(findIfPossible(N, S, X))
 
# This code is contributed by shivanisinghss2110


C#




// C# program for the above approach
using System;
 
public class GFG {
 
    // Function to find if any sequence is
    // possible or not.
    static void findIfPossible(int N, int S, int X)
    {
        if ((S >= X) && (S % 2 == X % 2)) {
 
            // Since, S is greater than equal to
            // X, and either both are odd or even
            // There always exists a sequence
            if (N >= 3) {
                Console.WriteLine("Yes");
            }
            if (N == 1) {
 
                // Only one case possible is
                // S == X or NOT;
                if (S == X) {
                    Console.WriteLine("Yes");
                }
                else {
                    Console.WriteLine("No");
                }
            }
 
            // Considering the above conditions true,
            // check if XOR of S^(S-X) is X or not
            if (N == 2) {
 
                int C = (S - X) / 2;
                int A = C;
                int B = C;
                A = A + X;
                if (((A ^ B) == X)) {
                    Console.WriteLine("Yes");
                }
                else {
                    Console.WriteLine("No");
                }
            }
        }
        else {
            Console.WriteLine("No");
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int N = 3, S = 10, X = 4;
 
        findIfPossible(N, S, X);
    }
}
 
// This code is contributed by Princi Singh


Javascript




<script>
        // JavaScript Program to implement
        // the above approach
 
        // Function to find if any sequence is
        // possible or not.
        function findIfPossible(N, S, X) {
            if (S >= X && S % 2 == X % 2) {
 
                // Since, S is greater than equal to
                // X, and either both are odd or even
                // There always exists a sequence
                if (N >= 3) {
                    return "Yes";
                }
                if (N == 1) {
 
                    // Only one case possible is
                    // S == X or NOT;
                    if (S == X) {
                        return "Yes";
                    }
                    else {
                        return "No";
                    }
                }
 
                // Considering the above conditions true,
                // check if XOR of S^(S-X) is X or not
                if (N == 2) {
 
                    let C = (S - X) / 2;
                    let A = C;
                    let B = C;
                    A = A + X;
                    if (((A ^ B) == X)) {
                        return "Yes";
                    }
                    else {
                        return "No";
                    }
                }
            }
            else {
                return "No";
            }
        }
 
        // Driver Code
        let N = 3, S = 10, X = 4;
 
        document.write(findIfPossible(N, S, X));
 
// This code is contributed by Potta Lokesh
    </script>


Output

Yes

Time Complexity: O(1)
Auxiliary Space: O(1)



Last Updated : 05 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads