Bilangan bulat A dan B yang diberikan, temukan bilangan bulat X sehingga:
- A, B <2 * 1e18
- A xor X = B + X
Saya sangat ragu apakah mungkin untuk menyelesaikan persamaan ini menggunakan matematika. Ini adalah masalah pengkodean yang saya temui 3 tahun yang lalu dan bahkan sekarang saya tidak bisa menyelesaikannya sendiri.
Kode saya sejauh ini: (ini adalah solusi brute force)
#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
. Cobalah untuk memikirkan kesetaraan itu sebentar.mod 2
seperti dalam matematika (mod 2), yaitu 3 === 7 (mod 2). Intinya adalah Anda dapat menemukan persamaan untuk bit pertama X, kemudian pergi ke bit berikutnya di mana (dengan menghargai carry) Anda mendapatkan persamaan untuk bit kedua, dll, seperti jawaban Daniel.Jawaban:
Catat itu
A + X == (A xor X) + ((A and X)<<1)
. Begitu:Dan kita mempunyai:
Jika kondisi terpenuhi, untuk setiap bilangan bulat Y yang tidak memiliki bit yang diatur dalam A, (((A - B) >> 1) atau Y) adalah solusi. Jika Anda hanya menginginkan satu solusi, Anda dapat menggunakan ((A - B) >> 1), di mana Y = 0. Jika tidak ada solusi.
sumber
A xor X
"tambahan tanpa membawa", dan((A and X)<<1)
"bawa tambahan". KarenaA + X
"penambahan dengan carry", persamaan pertama masuk akal.(A and X)<<1
pada dasarnya2*(A and X)
dan karena ini sama denganA-B
itu mengatakan bahwa masalahnya mungkin memiliki solusi hanya jika A dan B keduanya ganjil atau keduanya peristiwa.Ini tidak terlalu sulit, Anda hanya perlu berpikir kecil: misalkan kita sedang menulis
A
,B
danX
dalam biner danAᵢ
adalah nilai yang sesuai dengan bit 2 right paling kanan .Kita tahu bahwa:
Aₒ ⊕ Xₒ = Bₒ + Xₒ
.Mari kita gunakan contoh untuk menemukan cara mengevaluasi itu: A = 15 dan B = 6. Konversi ke biner:
Sekarang kami memiliki beberapa kemungkinan. Mari kita menganalisis bit paling kanan dari A dan B:
Kita tahu itu
d
hanya 0 atau 1, jadi:Terlihat bahwa XOR berperilaku seperti jumlah biner (dengan perbedaan bahwa XOR tidak membuat carryover untuk jumlah bit berikutnya):
jadi tidak akan selalu mungkin untuk menemukan X yang memuaskan
A ⊕ X = B + X
, karena tidak ada nilaid
yang memuaskan1 + d = 0 + d
.Bagaimanapun, jika X ada, Anda bisa mengetahuinya dengan cara ini, dari kanan ke kiri, mencari sedikit demi sedikit.
CONTOH LENGKAP KERJA
A = 15, B = 7:
Di sini, keduanya d = 0 dan d = 1 berlaku, lalu apa? Kita perlu memeriksa bit selanjutnya. Misalkan d = 1:
jadi dalam kasus ini, d harus 0.
tapi bagaimana dengan b? kita perlu memeriksa bit berikutnya, seperti biasa:
dan sekarang, untuk
a
:di sini
a
bisa 0 dan 1, tetapi harus 0, untuk menghindari akumulasi dalam jumlahB + X
.Kemudian,,
X = 0 1 0 0
dengan demikian X = 4.KODE
Anda bisa mengujinya di sini .
sumber