Hướng dẫn giải của Bedao Grand Contest 14 - SUM AND XOR
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Subtask 1 (~n, m \leq 3000~).
Duyệt tất cả cặp số ~a_i, b_j~ (~1 \leq i \leq n, 1 \leq j \leq m~) và cộng thêm ~a_i~ AND (~a_i~ XOR ~b_j~) vào đáp án.
Subtask 2 (Không có điều kiện gì thêm).
Xét bảng sau:
~x~ | ~y~ | ~x~ AND (~x~ XOR ~y~) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
Ta có thể thấy ~x~ AND (~x~ XOR ~y~) ~= x~ AND (NOT ~y~).
Vậy nên ta có thể xem biểu thức cần tính thành: $$ \sum_{i = 1}^n \sum_{j = 1}^m {a_i \; \text{AND} \; c_j} $$
Với ~c_j =~ NOT ~b_j~, ~\forall j \in [1, m]~.
Xét tới vị trí ~pos~ trong dãy bit. Ta nhận thấy rằng (~a_i~ AND ~c_j~) có chứa bit ~1~ tại vị trí ~pos~ khi và chỉ khi cả ~a_i~ và ~c_j~ đều chứa bit ~1~ tại vị trí đó.
Gọi ~cnt_a[pos]~ là số lượng phần tử trong mảng ~a~ chứa bit ~1~ tại vị trí ~pos~. Tương tự với ~cnt_c[pos]~.
Vậy trong ~n \cdot m~ số hạng sẽ có ~cnt_a[pos] \cdot cnt_c[pos]~ số hạng có chứa bit ~1~ tại vị trí ~pos~.
Vậy nên, kết quả của biểu thức cần tính là: $$ \sum_{pos = 0}^{19} cnt_a[pos] \cdot cnt_c[pos] \cdot 2^{pos}$$
Bình luận