Inclusion-Exclusion and its various Applications
In the field of Combinatorics, it is a counting method used to compute the cardinality of the union set. According to basic Inclusion-Exclusion principle:
- For 2 finite sets
A_1 andA_2 , which are subsets of Universal set, then(A_1-A_2), (A_2-A_1) and(A_1\bigcap A_2) are disjoint sets.
Hence it can be said that,\left|(A_1-A_2)\bigcup(A_2-A_1)\bigcup(A_1\bigcap A_2)\right| = \left|A_1\right| - \left|A_1\bigcap A_2\right| + \left|A_2\right| - \left|A_1\bigcap A_2\right| + \left|A_1\bigcap A_2\right| \left|A_1 \bigcup A_2\right| = \left|A_1\right| + \left|A_2\right| -\left|A_1 \bigcap A_2\right| .- Similarly for 3 finite sets
A_1 ,A_2 andA_3 ,\left|A_1 \bigcup A_2 \bigcup A_3\right| = \left|A_1\right| + \left|A_2\right| + \left|A_3\right| - \left|A_1 \bigcap A_2\right| - \left|A_2 \bigcap A_3\right| - \left|A_1 \bigcap A_3\right|+ \left|A_1 \bigcap A_2 \bigcap A_3\right|
Principle :
Inclusion-Exclusion principle says that for any number of finite sets
In general it can be said that,
\left|A_1 \bigcup A_2 \bigcup A_3 .. \bigcup A_i\right| = \sum\limits_{1 \leq k \leq i} \left|A_k\right| + (-1)\sum\limits_{1 \leq k_1 \textless k_2 \leq i} \left|A_{k_1} \bigcap A_{k_2}\right| + (-1)^2\sum\limits_{1 \leq k_1 \textless k_2 \textless k_3 \leq i} \left|A_{k_1} \bigcap A_{k_2} \bigcap A_{k_3}\right| .. + (-1)^{i+1}\sum\limits_{1 \leq k_1 \textless k_2 \textless k_3 \textless .. k_i\leq i} \left|A_{k_1} \bigcap A_{k_2} \bigcap A_{k_3} ..\bigcap A_{k_i}\right|
Properties :
- Computes the total number of elements that satisfy at least one of several properties.
- It prevents the problem of double counting.
Example 1:
As shown in the diagram, 3 finite sets A, B and C with their corresponding values are given. Compute
Solution :
The values of the corresponding regions, as can be noted from the diagram are -
By applying Inclusion-Exclusion principle,
Applications :
- Derangements
To determine the number of derangements( or permutations) of n objects such that no object is in its original position (like Hat-check problem).
As an example we can consider the derangements of the number in the following cases:
For i = 1, the total number of derangements is 0.
For i = 2, the total number of derangements is 1. This is2 1 .
For i = 3, the total number of derangements is 2. These are2 3 1 and 3 1 2.
Approach : - Inclusion-Exclusion Principle is a combinatorial counting technique that allows us to count the number of elements in the union of multiple sets. The principle states that the size of the union of two or more sets is equal to the sum of their sizes minus the size of their intersection, plus the size of the intersection of their pairwise intersections, and so on.
Here's the step-by-step approach in C++ to implement the Inclusion-Exclusion Principle:
Define the sets that need to be combined.
Compute the size of each set.
Compute the size of each intersection of two sets.
Compute the size of each intersection of three sets.
Continue computing the size of each intersection of four, five, and so on sets until you reach the final intersection.
Sum the sizes of all sets.
Subtract the size of all pairwise intersections.
Add the size of all three-way intersections.
Continue adding and subtracting the intersections of increasing sizes until you reach the final intersection.
Return the final count.
Here is an example of implementing the Inclusion-Exclusion Principle in C++ to find the number of positive integers less than 100 that are divisible by either 2, 3, or 5:
#include <iostream>
using namespace std;
int main() {
int n = 100;
int count = 0;
// Count the number of integers divisible by 2
for(int i = 2; i < n; i += 2) {
count++;
}
// Count the number of integers divisible by 3
for(int i = 3; i < n; i += 3) {
count++;
}
// Count the number of integers divisible by 5
for(int i = 5; i < n; i += 5) {
count++;
}
// Count the number of integers divisible by both 2 and 3
for(int i = 6; i < n; i += 6) {
count--;
}
// Count the number of integers divisible by both 2 and 5
for(int i = 10; i < n; i += 10) {
count--;
}
// Count the number of integers divisible by both 3 and 5
for(int i = 15; i < n; i += 15) {
count--;
}
// Count the number of integers divisible by 2, 3, and 5
for(int i = 30; i < n; i += 30) {
count++;
}
// Print the final count
cout << "The number of positive integers less than " << n << " that are divisible by either 2, 3, or 5 is " << count << "." << endl;
return 0;
}
n = 100
count = 0
# Count the number of integers divisible by 2
for i in range(2, n, 2):
count += 1
# Count the number of integers divisible by 3
for i in range(3, n, 3):
count += 1
# Count the number of integers divisible by 5
for i in range(5, n, 5):
count += 1
# Count the number of integers divisible by both 2 and 3
for i in range(6, n, 6):
count -= 1
# Count the number of integers divisible by both 2 and 5
for i in range(10, n, 10):
count -= 1
# Count the number of integers divisible by both 3 and 5
for i in range(15, n, 15):
count -= 1
# Count the number of integers divisible by 2, 3, and 5
for i in range(30, n, 30):
count += 1
# Print the final count
print(f"The number of positive integers less than {n} that are divisible by either 2, 3, or 5 is {count}.")
public class Main {
public static void main(String[] args) {
int n = 100;
int count = 0;
// Count the number of integers divisible by 2
for (int i = 2; i < n; i += 2) {
count++;
}
// Count the number of integers divisible by 3
for (int i = 3; i < n; i += 3) {
count++;
}
// Count the number of integers divisible by 5
for (int i = 5; i < n; i += 5) {
count++;
}
// Count the number of integers divisible by both 2 and 3
for (int i = 6; i < n; i += 6) {
count--;
}
// Count the number of integers divisible by both 2 and 5
for (int i = 10; i < n; i += 10) {
count--;
}
// Count the number of integers divisible by both 3 and 5
for (int i = 15; i < n; i += 15) {
count--;
}
// Count the number of integers divisible by 2, 3, and 5
for (int i = 30; i < n; i += 30) {
count++;
}
// Print the final count
System.out.println("The number of positive integers less than " + n + " that are divisible by either 2, 3, or 5 is " + count + ".");
}
}
Output
The number of positive integers less than 100 that are divisible by either 2, 3, or 5 is 73.
Time complexity :- O(2^n) or O(n^k)
Auxiliary Space :- O(n log log n)