Bài 58: Nguyên Lý Bao Hàm - Loại Trừ¶
Tác giả: FPTOJ Team
Nội dung tham khảo từ: CP-Algorithms, VNOI Wiki
1. Nguyên Lý Cơ Bản¶
1.1 Công thức 2 tập¶
Cho hai tập \(A\) và \(B\), số phần tử trong hợp:
Trừ đi phần giao vì đã đếm hai lần.
1.2 Công thức 3 tập¶
1.3 Công thức tổng quát (n tập)¶
Hoặc viết gọn:
Tương tự, đếm phần bù (những phần tử KHÔNG thuộc tập nào):
2. Ví dụ trực quan¶
2.1 Đếm số không chia hết cho 2, 3, hoặc 5 trong [1, 100]¶
Gọi: - \(A\): số chia hết cho 2 → \(|A| = \lfloor 100/2 \rfloor = 50\) - \(B\): số chia hết cho 3 → \(|B| = \lfloor 100/3 \rfloor = 33\) - \(C\): số chia hết cho 5 → \(|C| = \lfloor 100/5 \rfloor = 20\)
Giao: - \(|A \cap B| = \lfloor 100/6 \rfloor = 16\) - \(|A \cap C| = \lfloor 100/10 \rfloor = 10\) - \(|B \cap C| = \lfloor 100/15 \rfloor = 6\) - \(|A \cap B \cap C| = \lfloor 100/30 \rfloor = 3\)
Áp dụng:
Số không chia hết cho 2, 3, 5: \(100 - 74 = 26\).
3. Cài Đặt Tổng Quát¶
3.1 Duyệt tất cả tập con bằng bitmask¶
Khi số điều kiện \(n\) nhỏ (≤ 20), duyệt tất cả \(2^n\) tập con:
Độ phức tạp: \(O(2^n \cdot n)\) cho mỗi truy vấn.
4. Derangements (Hoán vị không có phần tử cố định)¶
4.1 Bài toán¶
Đếm số hoán vị của \(\{1, 2, \ldots, n\}\) sao cho không phần tử nào đứng nguyên vị trí.
4.2 Công thức¶
Gọi \(A_i\) là tập hoán vị mà phần tử \(i\) đứng nguyên vị trí. Cần đếm phần bù.
Tại sao công thức này đúng?
Áp dụng inclusion-exclusion: bắt đầu từ \(n!\) (tổng hoán vị), trừ đi các hoán vị có ít nhất 1 phần tử đứng đúng (\(\binom{n}{1}(n-1)!\)), cộng lại các hoán vị có ít nhất 2 phần tử đứng đúng (\(\binom{n}{2}(n-2)!\)), ... Sau khi rút gọn ta được công thức trên. Mỗi hệ số \(\frac{(-1)^k}{k!}\) tương ứng với việc chọn \(k\) phần tử cố định tại chỗ.
Hoặc truy hồi: \(D(n) = (n-1)(D(n-1) + D(n-2))\), \(D(1) = 0, D(2) = 1\).
5. Đếm hoán vị có phần tử bị cấm¶
5.1 Bài toán¶
Cho \(n\) phần tử, mỗi phần tử \(i\) có một tập \(B_i\) các vị trí bị cấm. Đếm số hoán vị mà phần tử \(i\) không đứng ở vị trí nào trong \(B_i\).
5.2 Giải bằng Inclusion-Exclusion¶
Với mỗi tập con \(S\) của các điều kiện "vi phạm", tính số hoán vị thỏa mãn tất cả vi phạm trong \(S\), rồi cộng/trừ theo công thức.
6. Surjection (Ánh onto)¶
6.1 Bài toán¶
Đếm số ánh xạ từ tập \(n\) phần tử onto tập \(k\) phần tử (mỗi phần tử trong tập đích phải được ánh tới ít nhất một lần).
6.2 Công thức¶
Tại sao công thức này đúng?
Áp dụng inclusion-exclusion: \((k-i)^n\) là số ánh xạ mà ít nhất \(i\) phần tử trong tập đích không được ánh tới (chỉ ánh vào \(k-i\) phần tử còn lại). \(\binom{k}{i}\) là cách chọn \(i\) phần tử bị bỏ qua. Dấu \((-1)^i\) là hệ số inclusion-exclusion.
7. Grid Paths với vật cản¶
7.1 Bài toán¶
Đếm số đường đi từ \((0,0)\) đến \((n,m)\) trên lưới, không đi qua các ô bị cấm.
7.2 Sắp xếp và Inclusion-Exclusion¶
Sắp xếp các ô cấm theo thứ tự. Với mỗi ô cấm \(i\), đếm số đường đi từ gốc đến \(i\) mà không qua ô cấm nào khác, rồi trừ đi phần đóng góp vào đích.
8. Bài tập luyện tập¶
Bài 1: Đếm số không chia hết¶
Đề bài: Cho số nguyên \(n\) và \(k\) số nguyên \(a_1, a_2, \ldots, a_k\). Đếm bao nhiêu số từ \(1\) đến \(n\) không chia hết cho bất kỳ \(a_i\) nào.
Input: - Dòng 1: 2 số nguyên \(n, k\) \((1 \leq n \leq 10^9, 1 \leq k \leq 20)\) - Dòng 2: \(k\) số nguyên \(a_i\) \((2 \leq a_i \leq 10^9)\)
Output: Số lượng số từ 1 đến \(n\) không chia hết cho bất kỳ \(a_i\).
Ví dụ:
| Input | Output |
|---|---|
10 22 3 |
3 |
100 32 3 5 |
26 |
Giải thích (test 1): Số từ 1 đến 10 chia hết cho 2 hoặc 3: {2,3,4,6,8,9,10} = 7 số. Đáp án = 10 - 7 = 3.
Lời giải
Dùng inclusion-exclusion trên \(k\) số. Duyệt \(2^k\) tập con, tính LCM, cộng/trừ.
Bài 2: Christmas Party (Derangement)¶
Đề bài: Có \(n\) người và \(n\) mũ. Mỗi người có đúng 1 mũ yêu cầu. Đếm số cách phân mũ sao cho không ai nhận đúng mũ mình yêu cầu.
Input: Số nguyên \(n\) \((1 \leq n \leq 10^6)\)
Output: Số derangements modulo \(10^9 + 7\).
Ví dụ:
| Input | Output |
|---|---|
3 |
2 |
4 |
9 |
Giải thích (test 1): 3 người {1,2,3}, mũ {1,2,3}. Derangements: {2,3,1} và {3,1,2}.
Lời giải
\(D(n) = (n-1)(D(n-1) + D(n-2))\) với \(D(1) = 0, D(2) = 1\).
Bài 3: Đếm surjection¶
Đề bài: Cho 2 số nguyên \(n\) và \(k\). Đếm số ánh xạ từ tập \(\{1,2,\ldots,n\}\) onto tập \(\{1,2,\ldots,k\}\) (mỗi phần tử trong tập đích được ánh tới ít nhất 1 lần).
Input: 2 số nguyên \(n, k\) \((1 \leq k \leq n \leq 10^6)\)
Output: Kết quả modulo \(10^9 + 7\).
Ví dụ:
| Input | Output |
|---|---|
3 2 |
6 |
4 3 |
36 |
Giải thích (test 1): Ánh xạ từ {1,2,3} onto {1,2}: mỗi phần tử {1,2} phải xuất hiện ít nhất 1 lần. Có \(2^3 = 8\) ánh xạ tổng, trừ 2 ánh xạ chỉ tới 1 phần tử → \(8 - 2 = 6\).
Lời giải
\(\text{Surj}(n,k) = \sum_{i=0}^{k} (-1)^i \binom{k}{i} (k-i)^n\).
Bài 4: Grid paths có vật cản¶
Đề bài: Lưới \(n \times m\) có \(k\) ô bị cấm. Đếm số đường đi từ \((1,1)\) đến \((n,m)\) chỉ đi phải hoặc xuống, không qua ô cấm.
Input: - Dòng 1: 3 số nguyên \(n, m, k\) \((1 \leq n, m \leq 10^5, 0 \leq k \leq 2000)\) - \(k\) dòng tiếp: 2 số nguyên \(r, c\) — ô bị cấm tại hàng \(r\), cột \(c\)
Output: Số đường đi modulo \(10^9 + 7\).
Ví dụ:
| Input | Output |
|---|---|
3 3 12 2 |
2 |
Giải thích: Lưới 3x3, ô (2,2) bị cấm. Đường đi hợp lệ: \((1,1) \to (1,2) \to (1,3) \to (2,3) \to (3,3)\) và \((1,1) \to (2,1) \to (3,1) \to (3,2) \to (3,3)\).
Lời giải
Sắp xếp ô cấm, dùng DP kết hợp inclusion-exclusion.