Nguyên lý bao hàm - loại trừ
Giới thiệu
Ví dụ nhập môn
Giả sử trong lớp có 10 học sinh thích Toán, 15 học sinh thích Văn, 21 học sinh thích Lập trình, hỏi có bao nhiêu học sinh thích ít nhất một môn?
Có phải \(10+15+21=46\) không? Không, vì có thể có học sinh thích nhiều môn.
Đặt các tập học sinh thích Văn, Toán, Lập trình lần lượt là \(A,B,C\), số học sinh là \(|A\cup B\cup C|\). Nếu cộng trực tiếp \(|A|,|B|,|C|\) thì bị đếm trùng nên phải trừ \(|A\cap B|,|B\cap C|,|C\cap A|\), nhưng lại bị trừ quá, cần cộng lại \(|A\cap B\cap C|\):

Khái quát thành nguyên lý bao hàm – loại trừ.
Định nghĩa
Cho \(U\) có \(n\) thuộc tính khác nhau. Thuộc tính thứ \(i\) là \(P_i\), các phần tử có thuộc tính \(P_i\) tạo tập \(S_i\), khi đó:
Tức:
Chứng minh
Dùng nhị thức Newton đếm số lần xuất hiện của mỗi phần tử. Với phần tử \(x\), giả sử nó thuộc \(T_1,T_2,\cdots,T_m\), số lần nó được đếm:
Mỗi phần tử được đếm đúng 1 lần, nên tổng là hợp. QED.
Bổ sung
Với giao của các tập trong vũ trụ \(U\), ta có:
Vế phải dùng bao hàm – loại trừ.
Phần trên quen thuộc, tiếp theo là ứng dụng qua 3 ví dụ.
Đếm nghiệm nguyên không âm của phương trình
Đếm nghiệm nguyên không âm
Cho phương trình \(\sum_{i=1}^nx_i=m\) và \(n\) điều kiện \(x_i\leq b_i\), với \(m,b_i \in \mathbb{N}\). Hỏi số nghiệm nguyên không âm.
Không có ràng buộc
Nếu bỏ \(x_i\leq b_i\), số nghiệm là \(\dbinom{m+n-1}{n-1}\).
Chứng minh: phương pháp cắm vạch.
Tương đương phân \(m\) quả bóng vào \(n\) hộp, cho phép hộp rỗng. Thêm \(n-1\) quả, chọn \(n-1\) vị trí cắm vạch trong \(m+n-1\) vị trí, được \(\dbinom{m+n-1}{n-1}\).
Mô hình bao hàm – loại trừ
Trừu tượng hóa:
- Vũ trụ \(U\): nghiệm không âm của \(\sum_{i=1}^nx_i=m\).
- Phần tử: biến \(x_i\).
- Thuộc tính: điều kiện \(x_i\leq b_i\).
Cần \(|\bigcap_{i=1}^nS_i|=|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right|\). \(|U|\) tính bằng tổ hợp, còn phần sau khai triển bao hàm – loại trừ.
Xét giao của một số \(\overline{S_{a_i}}\), nghĩa là \(x_{a_i}\ge b_{a_i}+1\). Đây là phương trình có một số biến có cận dưới. Ta trừ cận dưới để đưa về không âm.
Với
thì phương trình thành:
Vậy số nghiệm tính bằng tổ hợp. Mảng \(a\) độ dài \(k\) tương đương duyệt tập con.
HAOI2008 Mua sắm bằng xu
HAOI2008 硬币购物
Có 4 loại xu, loại \(i\) có mệnh giá \(C_i\). Có \(n\) truy vấn, mỗi truy vấn cho số lượng \(D_i\) của từng loại và giá \(S\), hỏi số cách trả.
\(n\leq 10^3,S\leq 10^5\).
Nếu dùng balo thì \(O(4nS)\), không chịu được. Điểm đặc biệt là chỉ có 4 loại. Mô hình: nghiệm không âm của \(\sum_{i=1}^4C_ix_i=S\) với \(x_i\leq D_i\).
Dùng bao hàm – loại trừ, thuộc tính \(x_i\leq D_i\). Khi đó cần:
tức là bài toán balo vô hạn. Có thể tiền xử lý, tổng \(O(4S+2^4n)\).
Cài đặt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Tô màu đồ thị con của đồ thị đầy đủ
Ba bài trước là áp dụng xuôi. Bài này cần phân tích ngược.
Tô màu đồ thị con của đồ thị đầy đủ
A và B thích tô màu đồ thị (không nhất thiết liên thông), quy tắc: các đỉnh kề nhau phải cùng màu. Với đồ thị đầy đủ \(n\) đỉnh \(G=(V,E)\), định nghĩa \(F(S)\) với \(S\subseteq E\) là số cách tô màu đồ thị \(G'=(V,S)\) bằng \(m\) màu. Nếu \(|S|\) lẻ thì điểm A tăng \(F(S)\), nếu chẵn thì điểm B tăng \(F(S)\). Hỏi chênh lệch điểm A và B.
Dạng toán học
Điểm chênh lệch là tổng có hệ số \((-1)\) theo chẵn lẻ. Ta cần:
Mô hình bao hàm – loại trừ
Điều kiện “đỉnh kề nhau cùng màu” là thuộc tính. Ta tạm bỏ luật này, tô màu tùy ý. Với đồ thị \(G'=(V,S)\) là phần tử. Thuộc tính \(x_i=x_j\) là đỉnh \(i,j\) cùng màu (không yêu cầu có cạnh). Gọi tập \(Q_{i,j}\) là các phương án tô màu thỏa \(x_i=x_j\); kích thước là số cách tô thỏa.
Quay lại đề: \(F(S)\) là số cách tô thỏa \(x_i=x_j\) với mọi \((i,j)\in S\), nên
Do bao hàm – loại trừ thường dùng một chỉ số, ánh xạ các cạnh \((i,j)\) thành \(k,1\le k\le T=\frac{n(n+1)}{2}\), và \(Q_{i,j}\to Q_k\). Thuộc tính \(x_i=x_j\) là \(P_k\). Khi đó \(S\) tương ứng \(K=\{k_1,\ldots,k_m\}\), và \(E\) tương ứng \(M=\{1,\ldots,T\}\):
Phân tích ngược
Khai triển:
Đây là dạng bao hàm – loại trừ, suy ra:
Vế phải là số cách tô mà tồn tại hai đỉnh cùng màu. Tổng số cách là \(|U|=m^n\). Lấy bù là số cách tất cả khác màu: \(A_m^n=\frac{m!}{(m-n)!}\). Do đó:
Giải bài bằng cách trừu tượng hóa, đưa \(F(S)\) về giao/hợp/bổ, rồi áp dụng bao hàm – loại trừ ngược.
Bao hàm – loại trừ trong số học
Bao hàm – loại trừ giúp giải một số bài số học.
Đếm cặp có gcd bằng k
Đếm cặp có gcd bằng \(k\)
Với \(1 \le x, y \le N\), \(f(k)\) là số cặp có thứ tự \((x, y)\) có \(\gcd(x,y)=k\). Tính \(f(1)\) đến \(f(N)\).
Có thể dùng Euler hoặc Möbius, nhưng bao hàm – loại trừ đơn giản.
Số cặp có ước chung là \(k\) trừ số cặp có ước chung là bội của \(k\) sẽ ra số cặp có gcd là \(k\). Tức:
Khi \(k>N/2\) thì \(f(k)=\lfloor (N/k) \rfloor ^2\). Duyệt ngược từ \(N\) xuống \(1\) là được.
1 2 3 4 | |
Độ phức tạp \(O(N \log N)\).
Bài luyện tập:
Suy ra công thức Euler
Công thức Euler
Tính \(\varphi(n)\), với \(\varphi(n)=|\{1\leq x\leq n|\gcd(x,n)=1\}|\).
Trực tiếp \(O(n\log n)\), sàng tuyến tính \(O(n)\), Dujiao sieve \(O(n^{2/3})\). Dùng bao hàm – loại trừ:
Phân tích:
Cần \(x\) không chia hết bởi mọi \(p_i\). Mỗi thuộc tính là \(p_i\nmid x\), tập \(S_i\). Khi đó:
\(|U|=n\), \(\overline{S_i}\) là tập \(p_i\mid x\), có \(|\overline{S_i}|=\frac{n}{p_i}\). Suy ra
Do đó:
Đây là biểu thức Euler.
Tổng quát hóa bao hàm – loại trừ
Cho hai hàm \(f(S),g(S)\), nếu
thì
Chứng minh
Bắt đầu từ vế phải:
Vế trong không phụ thuộc \(Q\):
Đặt \(F(P)=\sum_{T\subseteq P}(-1)^{|P|-|T|}\), ta có:
Do đó:
Chỉ khi \(|S\setminus Q|=0\) thì \(0^0=1\), tức \(Q=S\), đóng góp \(g(S)\). Còn lại bằng 0. Suy ra đúng.
Hệ quả
Nếu trong \(U\):
thì
Đây là dạng bổ, chứng minh tương tự.
Đếm DAG
Đếm DAG
Đếm số đồ thị có hướng không chu trình có \(n\) đỉnh có nhãn, modulo \(10^9+7\). \(n\leq 5\times 10^3\).
DP trực tiếp
Đặt \(f[i,j]\) là số DAG với \(i\) đỉnh, có \(j\) đỉnh bậc vào \(0\). Bỏ \(j\) đỉnh đó, còn \(k\) đỉnh bậc vào \(0\). Trong \(k\) đỉnh, phải có ít nhất một đỉnh nối từ tập \(j\), nên có \((2^j-1)^k\) cách; các đỉnh còn lại có \(2^{i-j-k}\) cách nối từ \(j\) đỉnh. Khi đó:
Độ phức tạp \(O(n^3)\).
Nới lỏng điều kiện
Đặt \(f[i]\) là số DAG có \(i\) đỉnh. Dùng bao hàm – loại trừ. Chọn \(j\) đỉnh, cho phép các cạnh từ chúng tới phần còn lại, có \(2^{(i-j)j}\) cách:
Độ phức tạp \(O(n^2)\).
Bao hàm – loại trừ min-max
Với dãy \(\{x_i\}\) thỏa thứ tự toàn phần và có phép cộng trừ, đặt \(S=\{1,2,3,\cdots,n\}\):
Chứng minh: Ánh xạ về bao hàm – loại trừ. Với \(x\in S\), giả sử \(x\) là phần tử nhỏ thứ \(k\). Đặt \(f:x\mapsto \{1,2,\cdots,k\}\), là song ánh.
Với \(x,y\in S\), \(f(\min(x,y))=f(x)\cap f(y)\), \(f(\max(x,y))=f(x)\cup f(y)\). Do đó:
Suy ra đẳng thức cho \(\max\), \(\min\) tương tự.
Công thức này quan trọng vì vẫn đúng với kỳ vọng:
Chứng minh: Viết kỳ vọng theo tổng trên mọi dãy \(y\) rồi đổi thứ tự tổng, tương tự chứng minh trên.
Còn mạnh hơn:
Quy ước nếu \(n< m\) thì \(\dbinom nm=0\).
Chứng minh: Không mất tính tổng quát, giả sử \(x_1\le\cdots\le x_n\). Khi đó:
Dùng \(\dbinom ab\dbinom bc=\dbinom ac\dbinom {a-c}{b-c}\):
Khi \(i=n-k+1\), tổng trong bằng 1, còn lại bằng 0. Suy ra đúng. Các công thức còn lại tương tự.
Từ min-max còn có:
Vì \(\operatorname{lcm},\gcd,a^{1},a^{-1}\) lần lượt như \(\max,\min,+,-\) trong mũ.
PKUWC2018 Random Walk
PKUWC2018 随机游走
Cho một cây \(n\) đỉnh, bắt đầu ở \(x\), mỗi bước chọn ngẫu nhiên một cạnh kề để đi. Có \(Q\) truy vấn, mỗi truy vấn cho tập \(S\), hỏi kỳ vọng số bước để đã đi qua tất cả đỉnh trong \(S\) ít nhất một lần. Đỉnh \(x\) được coi đã đi qua ngay từ đầu. Mod \(998244353\).
\(1\le n\le 18,1\le Q\le 5000,1\le |S|\le n\).
Đặt \(x_i\) là thời gian lần đầu đến đỉnh \(i\), cần:
Dùng min-max:
Với tập \(T\), đặt \(F(T)=E(\min_{i\in T}x_i)\). Đây là kỳ vọng thời gian lần đầu tới một đỉnh trong \(T\).
Gọi \(f(i)\) là kỳ vọng thời gian từ \(i\) đến \(T\):
- Nếu \(i\in T\), \(f(i)=0\).
- Nếu \(i\notin T\), \(f(i)=1+\frac{1}{\text{deg}(i)}\sum_{(i,j)\in E}f(j)\).
Giải trực tiếp bằng Gauss \(O(n^3)\), tổng \(O(2^nn^3)\) không được. Dùng khử trên cây.
Chọn gốc \(1\), cha \(p_u\). Với lá \(i\), \(f(i)\) chỉ phụ thuộc cha, viết \(f(i)=A_i+B_if(p_i)\).
Với nút \(i\) có con \(j_1,\cdots,j_k\), vì \(f(j_e)=A_{j_e}+B_{j_e}f(i)\), suy ra:
Suy ra:
Tức vẫn là \(A_i+B_if(p_i)\). Đẩy lên đến gốc:
Tính \(f(1)\), rồi đẩy xuống để có \(f(i)\), nên \(F(T)=f(x)\). Mỗi \(T\) tính \(O(n)\), tổng \(O(2^nn)\).
Quay lại:
Đặt \(F'(T)=(-1)^{|T|-1}F(T)\), thì \(E(\max_{i\in S}x_i)=\sum_{T\subseteq S}F'(T)\). Dùng FMT/FWT trong \(O(2^nn)\) để trả lời mọi \(S\).
Bài tập
Tài liệu tham khảo
浅探容斥原理 - 王迪,2013 年信息学奥林匹克中国国家队候选队员论文集
Last updated on this page:, Update history
Found an error? Want to help improve? Edit this page on GitHub!
Contributors to this page:OI-wiki
All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply