Menambahkan jawaban bagus FatalError, kalimat return f(b)^f(a-1);
itu bisa dijelaskan dengan lebih baik. Singkatnya, itu karena XOR memiliki properti luar biasa ini:
- Ini asosiatif - Tempatkan tanda kurung di mana pun Anda inginkan
- Ini bersifat komutatif - artinya Anda dapat memindahkan operator (mereka dapat "ngelaju")
Inilah keduanya beraksi:
(a ^ b ^ c) ^ (d ^ e ^ f) = (f ^ e) ^ (d ^ a ^ b) ^ c
- Itu membalikkan dirinya sendiri
Seperti ini:
a ^ b = c
c ^ a = b
Tambah dan perkalian adalah dua contoh operator asosiatif / komutatif lainnya, tetapi mereka tidak membalikkan dirinya sendiri. Oke, jadi, mengapa properti ini penting? Cara yang sederhana adalah mengembangkannya menjadi apa adanya, dan kemudian Anda dapat melihat properti ini bekerja.
Pertama, mari kita tentukan apa yang kita inginkan dan beri nama n:
n = (a ^ a+1 ^ a+2 .. ^ b)
Jika membantu, pikirkan XOR (^) seolah-olah itu adalah tambahan.
Mari kita juga mendefinisikan fungsinya:
f(b) = 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ b
b
lebih besar dari a
, jadi hanya dengan memasukkan beberapa tanda kurung ekstra dengan aman (yang dapat kami lakukan karena ini asosiatif), kami juga dapat mengatakan ini:
f(b) = ( 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ (a-1) ) ^ (a ^ a+1 ^ a+2 .. ^ b)
Yang disederhanakan menjadi:
f(b) = f(a-1) ^ (a ^ a+1 ^ a+2 .. ^ b)
f(b) = f(a-1) ^ n
Selanjutnya, kami menggunakan properti pembalikan dan komutivitas untuk memberi kami garis ajaib:
n = f(b) ^ f(a-1)
Jika Anda menganggap XOR seperti penjumlahan, Anda akan mengurangi pengurangan di sana. XOR adalah untuk XOR apa menambahkan untuk mengurangi!
Bagaimana saya mendapatkan ini sendiri?
Ingat properti operator logika. Bekerja dengan mereka hampir seperti menambah atau mengalikan jika itu membantu. Rasanya tidak biasa bahwa dan (&), xor (^) dan atau (|) adalah asosiatif, padahal memang demikian!
Jalankan implementasi naif melalui pertama, cari pola dalam output, lalu mulai temukan aturan yang mengonfirmasi bahwa pola tersebut benar. Sederhanakan penerapan Anda lebih jauh dan ulangi. Ini mungkin rute yang diambil oleh pembuat aslinya, disorot oleh fakta bahwa itu tidak sepenuhnya optimal (yaitu gunakan pernyataan switch daripada array).