Compruebe si es posible construir una array de tamaño N que tenga una suma como S y un valor XOR como X

Dados tres números N, S y X , la tarea es encontrar si es posible construir una secuencia A de longitud N , donde cada A[i] >= 0 para 1<=i<=N y la suma de todos los números en una secuencia es igual a S , y el XOR bit a bit de la secuencia es igual a X .

Ejemplos:

Entrada: N = 3, S = 10, X = 4 
Salida:
Explicación: Una de las secuencias posibles es {4, 3, 3} donde la suma es igual a 10 y XOR es igual a 4

Entrada: N = 1, S = 5, X = 3
Salida: No

 

Enfoque: Consideremos los siguientes casos de prueba. 

Caso-1: cuando N es igual a 1 , se puede ver fácilmente que cuando (S es igual a X) , solo devuelve » «, de lo contrario, » No «. 

Caso-2: Cuando N es mayor que igual a 3 , usa la fórmula (a + b) = (a xor b) + 2(a y b) Aquí se puede ver que (a + b) = S y (a xor b) = X por lo que la ecuación se convierte en S = X + 2(ab). Por lo tanto, (SX) debería ser par porque en el lado derecho tenemos 2(ab). Entonces, se puede decir que si S es impar, entonces X es impar y si S es par, entonces X es par, entonces (SX) también es par, lo que puede verificarse mediante (S%2 == X%2) también S >= X de lo contrario, AB se vuelve negativo, lo cual no es posible. 

Caso-3: Para el caso N es igual a 3, es algo así como   A + B + C = S   y A^B^C = X. Usa la propiedad A^A = 0 y  0^A = A => X + ( S – X)/2 + (S – X)/2 = X + (SX) => X + ( S – X)/2 + (S – X)/2 = S y también así: X ^( ( S – X)/2 ^ (SX)/2 ) = X ^ 0 = X. Por lo tanto, se prueba que para N == 3 siempre habrá tal secuencia y podemos simplemente devolver “ ”. 

Caso-4: Cuando N == 2 y  (S%2 == X%2) y S >= X , suponga que   A + B == S   y (A^B) == X entonces (A y B) == (SX)/2  De la ecuación discutida anteriormente. Sea C = AB Al observar detenidamente se puede notar que los bits de C son “1” sólo cuando los bits A y B son “1” para esa posición y apagados en caso contrario. Y X que es xor de A, B tiene un bit solo cuando hay diferentes bits que están en la i -ésima  posición A tiene ‘0’ y B tiene ‘1’ o justo lo contrario: Así que mirando esta secuencia, asigne cada bit a variable A y B, C = ( S – X)/2. Asignar A y B desde C ->A = C, B = C

Ahora agregue la X en A o B para asignar todos los unos en A y todos los ceros en B , de modo que cuando hacemos XOR ambos números, los bits ‘1’ agregados en A serán opuestos a lo que agregamos en B que es ‘0’ . La parte divertida es cuando los bits establecidos de C coinciden con algunos bits establecidos de X, entonces no dará el xor deseado de X. Ahora, A = C+ X, B = C. Ahora A + B = ( C+ X) + C = S y cuando XOR AB es igual a X entonces se puede asegurar que existe tal par cuando A + B == S   y (A^B) == X;

Siga los pasos a continuación para resolver el problema:

  • Si S es mayor que igual a X, y S%2 es igual a X%2 , realice los siguientes pasos; de lo contrario, devuelva No.
    • Si n es mayor que igual a 3, devuelva Sí.
    • Si n es igual a 1, y si S es igual a X, entonces devuelve , de lo contrario, devuelve No.
    • Si n es igual a 2, inicialice la variable C como (SX)/2 y establezca las variables A y B como C y agregue el valor X a la variable A y si A^B es igual a X, entonces imprima , de lo contrario imprima No.

A continuación se muestra la implementación del enfoque anterior.

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>
Producción

Yes

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por omkartripathi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *