Dado un entero no negativo N , la tarea es encontrar dos enteros A (mayor entero menor que N) y (menor entero mayor que N) tales que A + N = A ^ N y B + N = B ^ N
Ejemplos:
Entrada: N = 5
Salida: A = 2 y B = 8
2 + 8 = 2 ^ 8 = 10
Entrada: N = 10
Salida: A = 5 y B = 16
5 + 16 = 5 ^ 16 = 21
Enfoque: Vamos a encontrar A y B de forma independiente. Para resolver este problema tenemos que usar la propiedad, x + y = x^y + 2 * (x & y)
Dado que el problema establece que xor sum es igual a la suma dada, lo que implica que su AND debe ser 0.
- Encontrar A: N se puede representar como una serie de bits de 0 y 1. Para encontrar A, primero tendremos que encontrar el bit más significativo de N que está establecido. Dado que A & N = 0, los lugares donde N ha establecido un bit, para esos lugares haremos que los bits de A no estén establecidos y para los lugares donde N tenga un bit no establecido, haremos que ese bit se establezca para A, ya que queremos maximizar A Esto lo haremos para todos los bits desde el más significativo hasta el menos significativo. Por lo tanto obtendremos nuestra A.
- Encontrar B: Encontrar B es fácil. Sea i la posición del bit establecido más a la izquierda en 1. Queremos que B sea mayor que N, también queremos que B & N =0. Por lo tanto usando estos dos hechos B será siempre (1<< (i+1)).
A continuación se muestra la implementación del enfoque anterior:
CPP
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define MAX 32 // Function to find A and B void findAB(int N) { bitset<MAX> arr(N), brr(N); // To store the leftmost set bit in N int leftsetN = -1; for (int i = MAX - 1; i >= 0; --i) { if (arr[i] == 1) { leftsetN = i; break; } } // To store the value of A int A = 0; for (int i = leftsetN; i >= 0; --i) { // If the bit is unset in N // then we will set it in A if (arr[i] == 0) { A |= (1 << i); } } // To store the value of B int B = 0; // B will be (1 << (leftsetN + 1)) B = 1 << (leftsetN + 1); // Print the values of A and B cout << "A = " << A << " and B = " << B; } // Driver code int main() { int N = 5; findAB(N); return 0; }
Producción:
A = 2 and B = 8
Complejidad de tiempo: O (MAX)
Espacio Auxiliar: O(N)