Hướng dẫn giải của Bedao OI Contest 4 - Tổ hợp chẵn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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 \le 10^4~.

Ta duyệt mọi cặp vị trí ~i~, ~j~. Nếu cặp vị trí ~i~, ~j~ thỏa mãn điều kiện đề bài thì ta tăng biến kết quả lên ~1~ đơn vị.

Bài toán của chúng ta còn lại việc kiểm tra điều kiện ~\binom{a_i}{a_j}~ là chẵn.

Công thức tổ hợp chập ~r~ của ~n~: ~\binom{n}{r} = \frac{n!}{r!(n - r)!}~

Ta phân tích ~n! = 2^{k_n}d_n~ sao cho ~d_n~ là số lẻ.

Thay vào công thức tổ hợp chập, ta có: ~\binom{n}{r} \bmod 2 = \frac{n!}{r!(n - r)!} \bmod 2 = \frac{2^{k_n}d_n}{2^{k_r}d_r 2^{k_{n - r}}d_{n - r}} \bmod 2 = 2^{k_n - k_r - k_{n - r}} \bmod 2~.

Vậy, ~\binom{n}{r} \equiv 0 \pmod{2}~ khi và chỉ khi ~k_n - k_r - k_{n - r} \ne 0~.

~k_i~ có thể tính dựa trên công thức ~k_i = \sum_{p = 1}^\infty \lfloor \frac{i}{2^p} \rfloor = \lfloor \frac{i}{2} \rfloor + \sum_{p = 2}^\infty \lfloor \frac{i}{2^p} \rfloor = \lfloor \frac{i}{2} \rfloor + \sum_{p = 2}^\infty \lfloor \frac{\frac{i}{2}}{2^{p - 1}} \rfloor = \lfloor \frac{i}{2} \rfloor + \sum_{p = 1}^\infty \lfloor \frac{\frac{i}{2}}{2^{p}} \rfloor = \lfloor \frac{i}{2} \rfloor + k_{\lfloor \frac{i}{2} \rfloor}~.

Từ đây, ta có thể tính ~k_i, \forall i \in [0, 10^6]~ bằng quy hoạch động:

  • Cơ sở: ~k_0 = 0~.

  • Công thức đệ quy: ~k_i = k_{\lfloor \frac{i}{2} \rfloor} + \lfloor \frac{i}{2} \rfloor~.

Độ phức tạp: ~O(\max a_i + n^2)~.

Subtask 2: không có ràng buộc gì thêm.

Ta đi đếm số cặp ~i~, ~j~ cho ra kết quả ~\binom{a_i}{a_j}~ là lẻ.

Theo định lý Lucas, ~\binom{n}{r} \bmod p = \prod_{i = 0}^{k} \binom{n_i}{r_i} \bmod p~

Với ~p = 2~, ta có ~n_kn_{k-1}\ldots n_0~ là biểu diễn nhị phân của ~n~, ~r_kr_{k-1}\ldots r_0~ là biểu diễn nhị phân của ~r~, ~0 \le n_i, r_i \le 1, \forall i \in [0, k]~.

~\binom{n}{r}~ là lẻ khi và chỉ khi ~\binom{n_i}{r_i}~ lẻ với mọi ~i \in [0, k]~. Suy ra, ~\forall i \in [0, k]: r_i \le n_i~. Vậy ~n_k n_{k - 1} \ldots n_0~ là supermask của ~r_k r_{k - 1} \ldots r_0~. Từ đây, ta quy về bài toán DP SOS cơ bản, đếm số lượng cặp sao cho một số là supermask của một số khác.

Đặt ~cnt[x]~ là số lần xuất hiện của giá trị ~x~ trong mảng ~a[]~.

Ta tính ~f[mask] = \sum_{i \subseteq mask} cnt[i]~ bằng DP SOS.

Số cặp vị trí ~i~, ~j~ sao cho ~a_i \ge a_j~ và ~\binom{a_i}{a_j}~ lẻ là ~\sum_{i = 1}^n f[a_i]~.

Độ phức tạp: ~O(n + \max a_i \log_2 \max a_i)~


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.