Dado o número inteiro A e B, encontre o número X para que:
- A, B <2 * 1e18
- A xou X = B + X
Eu duvido que seja possível resolver essa equação usando matemática. Este é um problema de codificação que me deparei há 3 anos e, mesmo agora, não consigo resolver isso sozinho.
Meu código até agora: (esta é a solução de força bruta)
#include <iostream>
using namespace std;
int main()
{
unsigned long long a, b;
cin >> a >> b;
for (unsigned long long x = 1; x < max(a, b); x++) {
unsigned long long c = a ^ x;
unsigned long long d = b + x;
if (c == d) {
cout << x << endl;
break;
return 0;
}
}
cout << -1; //if no such integer exists
return 0;
}
a xor b = a + b mod 2
. Tente pensar nessa equivalência por um tempo.mod 2
que na matemática (mod 2), ou seja, 3 === 7 (mod 2). O ponto é que você pode descobrir uma equação para o primeiro bit de X e depois passar para o próximo bit, onde (respeitando o carry), obtém uma equação para o segundo bit, etc., como a resposta de Daniel.Respostas:
Note isso
A + X == (A xor X) + ((A and X)<<1)
. Assim:E nós temos:
Se a condição for atendida, para qualquer número inteiro Y que não tenha bits definidos em A, (((A - B) >> 1) ou Y) é uma solução. Se você quiser apenas uma solução, poderá usar ((A - B) >> 1), onde Y = 0. Caso contrário, não há solução.
fonte
A xor X
é "adição sem transporte" e((A and X)<<1)
"transporte na adição". ComoA + X
é "adição com transporte", a primeira equação faz sentido.(A and X)<<1
é basicamente2*(A and X)
e, como isso é igual,A-B
ele diz que o problema pode ter uma solução somente se A e B forem ímpares ou ambos os eventos.Não é muito difícil, você só precisa pensar pequeno: suponha que estamos escrevendo
A
,B
eX
em binário eAᵢ
é o valor correspondente à mais à direita 2 ⁱ bit.Sabemos que:
Aₒ ⊕ Xₒ = Bₒ + Xₒ
.Vamos usar um exemplo para descobrir como avaliar isso: A = 15 e B = 6. Convertendo em binário:
Agora temos algumas possibilidades. Vamos analisar os bits mais à direita de A e B:
Sabemos que
d
só pode ser 0 ou 1, então:É notável que o XOR se comporta exatamente como a soma binária (com a diferença de que o XOR não cria uma transição para a próxima soma de bits):
portanto, nem sempre é possível encontrar um X que satisfaça
A ⊕ X = B + X
, porque não há um valord
que satisfaça1 + d = 0 + d
.De qualquer forma, se o X existe, você pode descobrir dessa maneira, da direita para a esquerda, encontrando pouco a pouco.
EXEMPLO COMPLETO DE TRABALHO
A = 15, B = 7:
Aqui, tanto d = 0 ed = 1 se aplicam, então o que? Precisamos verificar o próximo bit. Suponha que d = 1:
portanto, nesse caso, d deve ser 0.
mas e b? precisamos verificar o próximo bit, como sempre:
e agora, para
a
:aqui
a
pode ser 0 e 1, mas deve ser 0, para evitar uma transição na somaB + X
.Então,
X = 0 1 0 0
então X = 4.CÓDIGO
Você pode testá-lo aqui .
fonte