El principio de inclusión-exclusión
El principio de inclusión-exclusión (inclusion-exclusion principle) es una técnica combinatoria importante para calcular el tamaño de un conjunto o la probabilidad de eventos complejos. Relaciona los tamaños de conjuntos individuales con el de su unión.
Enunciado
La fórmula verbal
El principio de inclusión-exclusión se puede expresar así:
Para calcular el tamaño de una unión de varios conjuntos, hay que sumar los tamaños de estos conjuntos por separado, luego restar los tamaños de todas las intersecciones por pares de los conjuntos, después volver a sumar el tamaño de las intersecciones de ternas de conjuntos, restar el tamaño de las cuádruplas de conjuntos, y así sucesivamente, hasta la intersección de todos los conjuntos.
Formulación en términos de conjuntos
La definición anterior se puede expresar matemáticamente de la siguiente manera:
Y de forma más compacta:
Formulación con diagramas de Venn
Supongamos que el diagrama muestra tres conjuntos , y :

Entonces el área de su unión es igual a la suma de las áreas , y menos las áreas cubiertas dos veces , , , pero con la suma del área cubierta por los tres conjuntos :
También se puede generalizar a una unión de conjuntos.
Formulación en términos de teoría de la probabilidad
Si son eventos y la probabilidad de que ocurra un evento de , entonces la probabilidad de su unión (es decir, la probabilidad de que ocurra al menos uno de los eventos) es igual a:
\begin{eqnarray} {\cal P} \left( \bigcup_{i=1}^n A_i \right) &=& \sum_{i=1}^n{\cal P}(A_i)\ - \sum_{1\leq i<j\leq n} {\cal P}(A_i \cap A_j)\ + \ &+& \sum _{1\leq i<j<k\leq n}{\cal P}(A_i \cap A_j \cap A_k) - \cdots + (-1)^{n-1} {\cal P}( A_1 \cap \cdots \cap A_n ) \end{eqnarray}
Y de forma más compacta:
Demostración
Para la demostración es conveniente usar la formulación matemática en términos de teoría de conjuntos:
Queremos probar que cualquier elemento contenido en al menos uno de los conjuntos aparece en la fórmula exactamente una vez (nótese que los elementos que no están presentes en ninguno de los conjuntos nunca se consideran en la parte derecha de la fórmula).
Consideremos un elemento que aparece en conjuntos . Mostraremos que se cuenta solo una vez en la fórmula. Nótese que:
- en los términos con , el elemento se contará veces;
- en los términos con , el elemento se contará veces, porque se contará en aquellos términos que incluyen dos de los conjuntos que contienen a ;
- en los términos con , el elemento se contará veces;
- en los términos con , el elemento se contará veces;
- en los términos con , el elemento se contará cero veces;
Esto nos lleva a la siguiente suma de coeficientes binomiales:
Esta expresión es muy similar a la expansión binomial de :
Cuando , se parece mucho a . Sin embargo, la expresión tiene un adicional, y está multiplicada por . Eso nos lleva a . Por lo tanto , que es lo que queríamos demostrar. El elemento se cuenta solo una vez.
Generalización para calcular el número de elementos en exactamente conjuntos {data-toc-label=“Generalización para calcular el número de elementos en exactamente r conjuntos”}
El principio de inclusión-exclusión se puede reescribir para calcular el número de elementos que están presentes en cero conjuntos:
Consideremos su generalización para calcular el número de elementos que están presentes en exactamente conjuntos:
Para demostrar esta fórmula, consideremos un particular. Por el principio básico de inclusión-exclusión podemos decir sobre él que:
Los conjuntos del lado izquierdo no se intersecan para distintos , así que podemos sumarlos directamente. También hay que notar que cualquier conjunto siempre tendrá coeficiente si aparece, y aparecerá para exactamente conjuntos .
Uso al resolver problemas
El principio de inclusión-exclusión es difícil de entender sin estudiar sus aplicaciones.
Primero veremos tres tareas sencillas “en papel”, que ilustran aplicaciones del principio, y luego consideraremos problemas más prácticos que son difíciles de resolver sin el principio de inclusión-exclusión.
Las tareas que piden “encontrar el número de formas” merecen atención, porque a veces conducen a soluciones polinomiales, no necesariamente exponenciales.
Una tarea sencilla sobre permutaciones
Tarea: contar cuántas permutaciones de los números del al existen tales que el primer elemento sea mayor que y el último sea menor que .
Contemos el número de permutaciones “malas”, es decir, permutaciones en las que el primer elemento es y/o el último es .
Denotaremos por el conjunto de permutaciones en las que el primer elemento es y por el conjunto de permutaciones en las que el último elemento es . Entonces el número de permutaciones “malas”, según la fórmula de inclusión-exclusión, será:
Tras un cálculo combinatorio sencillo, llegamos a:
Solo queda restar este número del total de para obtener el número de permutaciones “buenas”.
Una tarea sencilla sobre secuencias de (0, 1, 2)
Tarea: contar cuántas secuencias de longitud existen formadas solo por los números tales que cada número ocurre al menos una vez.
De nuevo pasamos al problema inverso, es decir, calculamos el número de secuencias que no contienen al menos uno de los números.
Denotemos por el conjunto de secuencias en las que el dígito no ocurre. La fórmula de inclusión-exclusión para el número de secuencias “malas” será:
- El tamaño de cada es , porque cada secuencia solo puede contener dos de los dígitos.
- El tamaño de cada intersección por pares es igual a , porque solo habrá un dígito con el que construir la secuencia.
- El tamaño de la intersección de los tres conjuntos es igual a , porque no habrá dígitos con los que construir la secuencia.
Como resolvimos el problema inverso, lo restamos del total de secuencias:
### Número de sumas de enteros con cota superior {: #number-of-upper-bound-integer-sums }
Consideremos la siguiente ecuación:
donde .
Tarea: contar el número de soluciones de la ecuación.
Olvidemos por un momento la restricción sobre y contemos simplemente el número de soluciones no negativas de esta ecuación. Esto se hace fácilmente usando estrellas y barras: queremos partir una secuencia de unidades en grupos, lo que es lo mismo que disponer barras y estrellas:
Ahora calcularemos el número de soluciones “malas” con el principio de inclusión-exclusión. Las soluciones “malas” serán aquellas en las que uno o más son mayores o iguales que .
Denotemos por el conjunto de soluciones donde , y todos los demás (pueden ser o no). Para calcular el tamaño de , nótese que esencialmente tenemos el mismo problema combinatorio que se resolvió en los dos párrafos anteriores, pero ahora de las unidades se excluyen de las ranuras y pertenecen definitivamente al primer grupo. Así:
De manera similar, el tamaño de la intersección entre dos conjuntos y (para ) es igual a:
El tamaño de cada intersección de tres conjuntos es cero, porque unidades no alcanzarán para tres o más variables mayores o iguales que .
Combinando todo esto en la fórmula de inclusión-exclusión y dado que resolvimos el problema inverso, obtenemos por fin la respuesta:
Esto se generaliza fácilmente a números que suman con la restricción :
Como arriba, tratamos los coeficientes binomiales con índice superior negativo como cero.
Nótese que este problema también se podría resolver con programación dinámica o funciones generatrices. La respuesta de inclusión-exclusión se calcula en tiempo (suponiendo que las operaciones matemáticas como el coeficiente binomial son de tiempo constante), mientras que un enfoque de DP sencillo tomaría tiempo .
El número de coprimos en un intervalo dado
Tarea: dados dos números y , contar el número de enteros en el intervalo que son coprimos con (su máximo común divisor es ).
Resolvamos el problema inverso: calcular el número de enteros que no son coprimos con .
Denotaremos los factores primos de como .
¿Cuántos números en el intervalo son divisibles por ? La respuesta a esta pregunta es:
Sin embargo, si simplemente sumamos estos números, algunos se contarán varias veces (aquellos que comparten varios como factores). Por lo tanto, es necesario usar el principio de inclusión-exclusión.
Iteraremos sobre todos los subconjuntos de los , calcularemos su producto y sumaremos o restaremos el número de múltiplos de su producto.
Aquí hay una implementación en C++:
int solve (int n, int r) {
vector<int> p;
for (int i=2; i*i<=n; ++i)
if (n % i == 0) {
p.push_back (i);
while (n % i == 0)
n /= i;
}
if (n > 1)
p.push_back (n);
int sum = 0;
for (int msk=1; msk<(1<<p.size()); ++msk) {
int mult = 1,
bits = 0;
for (int i=0; i<(int)p.size(); ++i)
if (msk & (1<<i)) {
++bits;
mult *= p[i];
}
int cur = r / mult;
if (bits % 2 == 1)
sum += cur;
else
sum -= cur;
}
return r - sum;
}La cota asintótica de la solución es .
El número de enteros en un intervalo dado que son múltiplos de al menos uno de los números dados
Dados números y un número . Se quiere contar el número de enteros en el intervalo que son múltiplos de al menos uno de los .
El algoritmo de solución es casi idéntico al de la tarea anterior: construir la fórmula de inclusión-exclusión sobre los números , es decir, cada término de esta fórmula es el número de números divisibles por un subconjunto dado de números (en otras palabras, divisibles por su mínimo común múltiplo).
Así que ahora iteraremos sobre todos los subconjuntos de enteros con operaciones para hallar su mínimo común múltiplo, sumando o restando el número de múltiplos de este en el intervalo. La cota asintótica es .
El número de strings que satisfacen un patrón dado
Consideremos patrones de strings de la misma longitud, formados solo por letras () o signos de interrogación. También se da un número . Un string coincide con un patrón si tiene la misma longitud que el patrón y, en cada posición, o bien los caracteres correspondientes son iguales, o bien el carácter del patrón es un signo de interrogación. La tarea es contar el número de strings que coinciden exactamente con de los patrones (primer problema) y con al menos de los patrones (segundo problema).
Nótese primero que podemos contar fácilmente el número de strings que satisfacen a la vez todos los patrones especificados. Para ello, simplemente “cruzamos” los patrones: iteramos por las posiciones (“ranuras”) y miramos una posición en todos los patrones. Si todos los patrones tienen un signo de interrogación en esta posición, el carácter puede ser cualquier letra de a . En caso contrario, el carácter de esta posición queda unívocamente determinado por los patrones que no contienen un signo de interrogación.
Aprendamos ahora a resolver la primera versión del problema: cuando el string debe satisfacer exactamente de los patrones.
Para resolverlo, iteramos y fijamos un subconjunto específico del conjunto de patrones formado por patrones. Entonces tenemos que contar el número de strings que satisfacen este conjunto de patrones, y solo coinciden con él, es decir, no coinciden con ningún otro patrón. Usaremos el principio de inclusión-exclusión de una manera un poco distinta: sumamos sobre todos los superconjuntos (subconjuntos del conjunto original de strings que contienen a ), y o bien sumamos a la respuesta actual o la restamos del número de strings:
Donde es el número de strings que coinciden con (al menos ).
(Si cuesta visualizar esto, se pueden dibujar diagramas de Venn.)
Si sumamos sobre todos los , obtendremos la respuesta final:
Sin embargo, la cota asintótica de esta solución es . Para mejorarla, nótese que distintos cálculos de comparten muy a menudo conjuntos .
Invertiremos la fórmula de inclusión-exclusión y sumaremos en términos de conjuntos . Ahora queda claro que el mismo conjunto se tendría en cuenta en el cálculo de de conjuntos con el mismo signo .
Ahora nuestra solución tiene cota asintótica .
Resolveremos ahora la segunda versión del problema: hallar el número de strings que coinciden con al menos de los patrones.
Por supuesto, podemos usar la solución de la primera versión del problema y sumar las respuestas para conjuntos de tamaño mayor que . Sin embargo, se puede notar que en este problema un conjunto se considera en la fórmula para todos los conjuntos de tamaño que están contenidos en . Dicho esto, podemos escribir la parte de la expresión que se multiplica por como:
Mirando el libro de Graham (Graham, Knuth, Patashnik. “Concrete mathematics” [1998] ), vemos una fórmula conocida para coeficientes binomiales:
Aplicándola aquí, encontramos que toda la suma de coeficientes binomiales se reduce a:
Así, para esta tarea también obtuvimos una solución con cota asintótica :
El número de formas de ir de una celda a otra
Hay un tablero , y de sus celdas son paredes intransitables. Un robot está inicialmente en la celda (abajo a la izquierda). El robot solo puede moverse a la derecha o hacia arriba, y eventualmente necesita llegar a la celda , evitando todos los obstáculos. Hay que contar el número de formas en que puede hacerlo.
Supongamos que los tamaños y son muy grandes (por ejemplo, ), y el número es pequeño (alrededor de ).
Por ahora, ordenemos los obstáculos por su coordenada y, en caso de empate, por la coordenada .
También aprendamos simplemente a resolver un problema sin obstáculos: es decir, a contar el número de formas de ir de una celda a otra. En un eje tenemos que atravesar celdas y en el otro, celdas. Por combinatoria elemental, obtenemos una fórmula usando coeficientes binomiales:
Ahora, para contar el número de formas de ir de una celda a otra evitando todos los obstáculos, se puede usar inclusión-exclusión para resolver el problema inverso: contar el número de formas de recorrer el tablero pisando un subconjunto de obstáculos (y restarlo del número total de formas).
Al iterar sobre un subconjunto de obstáculos que pisaremos, para contar el número de formas de hacerlo basta multiplicar el número de todos los caminos desde la celda inicial hasta el primero de los obstáculos seleccionados, del primer obstáculo al segundo, y así sucesivamente, y luego sumar o restar este número de la respuesta, de acuerdo con la fórmula estándar de inclusión-exclusión.
Sin embargo, esto de nuevo no será polinomial, con complejidad .
Aquí va una solución polinomial:
Usaremos programación dinámica. Por conveniencia, insertamos al principio y al final del arreglo de obstáculos. Calculemos los números : el número de formas de ir del punto de partida (-ésimo) al -ésimo, sin pisar ningún otro obstáculo (excepto , por supuesto). Calcularemos este número para todas las celdas-obstáculo, y también para la de llegada.
Olvidemos por un segundo los obstáculos y contemos simplemente el número de caminos de la celda a . Hay que considerar algunos caminos “malos”, los que pasan por los obstáculos, y restarlos del número total de formas de ir de a .
Al considerar un obstáculo entre e () sobre el que podemos pisar, vemos que el número de caminos de a que pasan por y que tienen a como el primer obstáculo entre el inicio e . Podemos calcularlo como: multiplicado por el número de caminos arbitrarios de a . Podemos contar el número de formas “malas” sumando esto para todo entre e .
Podemos calcular en para obstáculos, así que esta solución tiene complejidad .
El número de cuádruplas coprimas
Se dan números: . Se pide contar el número de formas de elegir cuatro números de modo que su máximo común divisor conjunto sea igual a uno.
Resolveremos el problema inverso: calcular el número de cuádruplas “malas”, es decir, cuádruplas en las que todos los números son divisibles por un número .
Usaremos el principio de inclusión-exclusión sumando sobre todos los grupos posibles de cuatro números divisibles por un divisor .
donde es el número de primos en la factorización del número y el número de cuádruplas divisibles por .
Para calcular la función , basta contar el número de múltiplos de (como se mencionó en una tarea anterior) y usar coeficientes binomiales para contar el número de formas de elegir cuatro de ellos.
Así, usando la fórmula de inclusión-exclusión sumamos el número de grupos de cuatro divisibles por un número primo, luego restamos el número de cuádruplas que son divisibles por el producto de dos primos, sumamos cuádruplas divisibles por tres primos, etc.
El número de ternas armónicas
Se da un número . Se pide contar el número de ternas que satisfacen una de las siguientes condiciones:
- o bien ,
- o bien .
Primero, pasemos directo al problema inverso: es decir, contar el número de ternas no armónicas.
Segundo, nótese que cualquier terna no armónica está formada por un par de coprimos y un tercer número que no es coprimo con al menos uno del par.
Así, el número de ternas no armónicas que contienen a es igual al número de enteros de a que son coprimos con multiplicado por el número de enteros que no son coprimos con .
O bien
o bien
En ambos casos se contará dos veces. El primer caso se contará cuando y cuando . El segundo caso se contará cuando y cuando . Por lo tanto, para calcular el número de ternas no armónicas, sumamos este cálculo para todo de a y lo dividimos por .
Ahora solo nos queda aprender a contar el número de coprimos con en el intervalo . Aunque este problema ya se mencionó, la solución anterior no sirve aquí: requeriría la factorización de cada uno de los enteros de a , y luego iterar por todos los subconjuntos de estos primos.
Es posible una solución más rápida con esta modificación de la criba de Eratóstenes:
-
Primero, hallamos todos los números en el intervalo tales que su factorización en primos no incluye un factor primo dos veces. También necesitaremos saber, para estos números, cuántos factores incluye.
- Para ello mantendremos un arreglo para guardar el número de primos en la factorización de , y un arreglo , para marcar si contiene cada factor a lo sumo una vez () o no (). Al iterar de a , si llegamos a un número que tiene igual a , entonces es primo y su es .
- Durante la criba de Eratóstenes, iteraremos de a . Al procesar un número primo recorremos todos sus múltiplos y aumentamos su . Si uno de estos múltiplos es múltiplo del cuadrado de , entonces podemos poner como falso.
-
Segundo, necesitamos calcular la respuesta para todo de a , es decir, el arreglo : el número de enteros no coprimos con .
- Para ello, recordemos cómo funciona la fórmula de inclusión-exclusión: en realidad aquí implementamos el mismo concepto, pero con la lógica invertida: iteramos sobre un componente (un producto de primos de la factorización) y sumamos o restamos su término en la fórmula de inclusión-exclusión de cada uno de sus múltiplos.
- Así, digamos que estamos procesando un número tal que , es decir, interviene en la fórmula de inclusión-exclusión. Iteramos por todos los números que son múltiplos de , y o bien sumamos o restamos de su (el signo depende de : si es impar, entonces debemos sumar; en caso contrario, restar).
Aquí hay una implementación en C++:
int n;
bool good[MAXN];
int deg[MAXN], cnt[MAXN];
long long solve() {
memset (good, 1, sizeof good);
memset (deg, 0, sizeof deg);
memset (cnt, 0, sizeof cnt);
long long ans_bad = 0;
for (int i=2; i<=n; ++i) {
if (good[i]) {
if (deg[i] == 0) deg[i] = 1;
for (int j=1; i*j<=n; ++j) {
if (j > 1 && deg[i] == 1)
if (j % i == 0)
good[i*j] = false;
else
++deg[i*j];
cnt[i*j] += (n / i) * (deg[i]%2==1 ? +1 : -1);
}
}
ans_bad += (cnt[i] - 1) * 1ll * (n-1 - cnt[i]);
}
return (n-1) * 1ll * (n-2) * (n-3) / 6 - ans_bad / 2;
}La cota asintótica de nuestra solución es , porque para casi todo número hasta hacemos iteraciones en el bucle anidado.
El número de permutaciones sin puntos fijos (desarreglos)
Probar que el número de permutaciones de longitud sin puntos fijos (es decir, ningún número está en la posición ; también llamadas desarreglos o derangements) es igual al siguiente número:
y aproximadamente igual a:
(si se redondea esta expresión al entero más cercano, se obtiene exactamente el número de permutaciones sin puntos fijos)
Denotemos por el conjunto de permutaciones de longitud con un punto fijo en la posición () (es decir, el elemento está en la posición ).
Ahora usamos la fórmula de inclusión-exclusión para contar el número de permutaciones con al menos un punto fijo. Para ello necesitamos aprender a contar tamaños de una intersección de conjuntos , como sigue:
\begin{eqnarray} \left| A_p \right| &=& (n-1)!\ , \ \left| A_p \cap A_q \right| &=& (n-2)!\ , \ \left| A_p \cap A_q \cap A_r \right| &=& (n-3)!\ , \ \cdots , \end{eqnarray}
porque si sabemos que el número de puntos fijos es igual a , entonces conocemos la posición de elementos de la permutación, y los demás elementos se pueden colocar en cualquier parte.
Sustituyendo esto en la fórmula de inclusión-exclusión, y dado que el número de formas de elegir un subconjunto de tamaño del conjunto de elementos es igual a , obtenemos una fórmula para el número de permutaciones con al menos un punto fijo:
Entonces el número de permutaciones sin puntos fijos es igual a:
Simplificando esta expresión, obtenemos expresiones exactas y aproximadas para el número de permutaciones sin puntos fijos:
(porque la suma entre paréntesis son los primeros términos de la expansión en serie de Taylor de )
Vale la pena notar que un problema similar se puede resolver de esta manera: cuando se necesita que los puntos fijos no estén entre los primeros elementos de las permutaciones (y no entre todos, como acabamos de resolver). La fórmula obtenida es como la fórmula exacta dada arriba, pero irá hasta la suma de , en lugar de .
Problemas de práctica
Una lista de tareas que se pueden resolver usando el principio de inclusión-exclusión:
- UVA #10325 “The Lottery” [difficulty: low]
- UVA #11806 “Cheerleaders” [difficulty: low]
- TopCoder SRM 477 “CarelessSecretary” [difficulty: low]
- TopCoder TCHS 16 “Divisibility” [difficulty: low]
- SPOJ #6285 NGM2 , “Another Game With Numbers” [difficulty: low]
- TopCoder SRM 382 “CharmingTicketsEasy” [difficulty: medium]
- TopCoder SRM 390 “SetOfPatterns” [difficulty: medium]
- TopCoder SRM 176 “Deranged” [difficulty: medium]
- TopCoder SRM 457 “TheHexagonsDivOne” [difficulty: medium]
- SPOJ #4191 MSKYCODE “Sky Code” [difficulty: medium]
- SPOJ #4168 SQFREE “Square-free integers” [difficulty: medium]
- CodeChef “Count Relations” [difficulty: medium]
- SPOJ - Almost Prime Numbers Again
- SPOJ - Find number of Pair of Friends
- SPOJ - Balanced Cow Subsets
- SPOJ - EASY MATH [difficulty: medium]
- SPOJ - MOMOS - FEASTOFPIGS [difficulty: easy]
- Atcoder - Grid 2 [difficulty: easy]
- Codeforces - Count GCD