Skip to Content

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:

i=1nAi=i=1nAi1i<jnAiAj+1i<j<knAiAjAk+(1)n1A1An\left| \bigcup_{i=1}^n A_i \right| = \sum_{i=1}^n|A_i| - \sum_{1\leq i<j\leq n} |A_i \cap A_j| + \sum _{1\leq i<j<k\leq n}|A_i \cap A_j \cap A_k| - \cdots + (-1)^{n-1} | A_1 \cap \cdots \cap A_n |

Y de forma más compacta:

i=1nAi=J{1,2,,n}(1)J1jJAj\left|\bigcup_{i=1}^n A_i \right| = \sum_{\emptyset \neq J\subseteq {1,2,\ldots ,n}} (-1)^{|J|-1}{\Biggl |}\bigcap_{j\in J}A_{j}{\Biggr |}

Formulación con diagramas de Venn

Supongamos que el diagrama muestra tres conjuntos AA, BB y CC:

Diagrama de Venn

Entonces el área de su unión ABCA \cup B \cup C es igual a la suma de las áreas AA, BB y CC menos las áreas cubiertas dos veces ABA \cap B, ACA \cap C, BCB \cap C, pero con la suma del área cubierta por los tres conjuntos ABCA \cap B \cap C:

S(ABC)=S(A)+S(B)+S(C)S(AB)S(AC)S(BC)+S(ABC)S(A \cup B \cup C) = S(A) + S(B) + S(C) - S(A \cap B) - S(A \cap C) - S(B \cap C) + S(A \cap B \cap C)

También se puede generalizar a una unión de nn conjuntos.

Formulación en términos de teoría de la probabilidad

Si AiA_i (i=1,2…n)(i = 1,2…n) son eventos y P(Ai){\cal P}(A_i) la probabilidad de que ocurra un evento de AiA_i, 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) &amp;=&amp; \sum_{i=1}^n{\cal P}(A_i)\ - \sum_{1\leq i&lt;j\leq n} {\cal P}(A_i \cap A_j)\ + \ &amp;+&amp; \sum _{1\leq i&lt;j&lt;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:

P(i=1nAi)=J{1,2,,n}(1)J1 P(jJAj){\cal P} \left(\bigcup_{i=1}^n A_i \right) = \sum_{\emptyset \neq J\subseteq {1,2,\ldots ,n}} (-1)^{|J|-1}\ {\cal P}{\Biggl (}\bigcap_{j\in J}A_{j}{\Biggr )}

Demostración

Para la demostración es conveniente usar la formulación matemática en términos de teoría de conjuntos:

i=1nAi=J{1,2,,n}(1)J1jJAj\left|\bigcup_{i=1}^n A_i \right| = \sum_{\emptyset \neq J\subseteq {1,2,\ldots ,n}} (-1)^{|J|-1}{\Biggl |}\bigcap_{j\in J}A_{j}{\Biggr |}

Queremos probar que cualquier elemento contenido en al menos uno de los conjuntos AiA_i aparece en la fórmula exactamente una vez (nótese que los elementos que no están presentes en ninguno de los conjuntos AiA_i nunca se consideran en la parte derecha de la fórmula).

Consideremos un elemento xx que aparece en k1k \geq 1 conjuntos AiA_i. Mostraremos que se cuenta solo una vez en la fórmula. Nótese que:

  • en los términos con J=1|J| = 1, el elemento xx se contará + k+\ k veces;
  • en los términos con J=2|J| = 2, el elemento xx se contará  (k2)-\ \binom{k}{2} veces, porque se contará en aquellos términos que incluyen dos de los kk conjuntos que contienen a xx;
  • en los términos con J=3|J| = 3, el elemento xx se contará + (k3)+\ \binom{k}{3} veces;
  • \cdots
  • en los términos con J=k|J| = k, el elemento xx se contará (1)k1(kk)(-1)^{k-1}\cdot \binom{k}{k} veces;
  • en los términos con J>k|J| \gt k, el elemento xx se contará cero veces;

Esto nos lleva a la siguiente suma de coeficientes binomiales:

T=(k1)(k2)+(k3)+(1)i1(ki)++(1)k1(kk) T = \binom{k}{1} - \binom{k}{2} + \binom{k}{3} - \cdots + (-1)^{i-1}\cdot \binom{k}{i} + \cdots + (-1)^{k-1}\cdot \binom{k}{k}

Esta expresión es muy similar a la expansión binomial de (1x)k(1 - x)^k:

(1x)k=(k0)(k1)x+(k2)x2(k3)x3++(1)k(kk)xk (1 - x)^k = \binom{k}{0} - \binom{k}{1} \cdot x + \binom{k}{2} \cdot x^2 - \binom{k}{3} \cdot x^3 + \cdots + (-1)^k\cdot \binom{k}{k} \cdot x^k

Cuando x=1x = 1, (1x)k(1 - x)^k se parece mucho a TT. Sin embargo, la expresión tiene un (k0)=1\binom{k}{0} = 1 adicional, y está multiplicada por 1-1. Eso nos lleva a (11)k=1T(1 - 1)^k = 1 - T. Por lo tanto T=1(11)k=1T = 1 - (1 - 1)^k = 1, 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 rr 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:

i=1nAi=m=0n(1)mX=miXAi\left|\bigcap_{i=1}^n \overline{A_i}\right|=\sum_{m=0}^n (-1)^m \sum_{|X|=m} \left|\bigcap_{i\in X} A_{i}\right|

Consideremos su generalización para calcular el número de elementos que están presentes en exactamente rr conjuntos:

B=r[iBAij∉BAj]=m=rn(1)mr(mr)X=miXAi\left|\bigcup_{|B|=r}\left[\bigcap_{i \in B} A_i \cap \bigcap_{j \not\in B} \overline{A_j}\right]\right|=\sum_{m=r}^n (-1)^{m-r}\dbinom{m}{r} \sum_{|X|=m} \left|\bigcap_{i \in X} A_{i}\right|

Para demostrar esta fórmula, consideremos un BB particular. Por el principio básico de inclusión-exclusión podemos decir sobre él que:

iBAij∉BAj=m=rn(1)mrX=mBXiXAi\left|\bigcap_{i \in B} A_i \cap \bigcap_{j \not \in B} \overline{A_j}\right|=\sum_{m=r}^{n} (-1)^{m-r} \sum_{\substack{|X|=m \newline B \subset X}}\left|\bigcap_{i\in X} A_{i}\right|

Los conjuntos del lado izquierdo no se intersecan para distintos BB, así que podemos sumarlos directamente. También hay que notar que cualquier conjunto XX siempre tendrá coeficiente (1)mr(-1)^{m-r} si aparece, y aparecerá para exactamente (mr)\dbinom{m}{r} conjuntos BB.

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 00 al 99 existen tales que el primer elemento sea mayor que 11 y el último sea menor que 88.

Contemos el número de permutaciones “malas”, es decir, permutaciones en las que el primer elemento es 1\leq 1 y/o el último es 8\geq 8.

Denotaremos por XX el conjunto de permutaciones en las que el primer elemento es 1\leq 1 y por YY el conjunto de permutaciones en las que el último elemento es 8\geq 8. Entonces el número de permutaciones “malas”, según la fórmula de inclusión-exclusión, será:

XY=X+YXY |X \cup Y| = |X| + |Y| - |X \cap Y|

Tras un cálculo combinatorio sencillo, llegamos a:

29!+29!228! 2 \cdot 9! + 2 \cdot 9! - 2 \cdot 2 \cdot 8!

Solo queda restar este número del total de 10!10! para obtener el número de permutaciones “buenas”.

Una tarea sencilla sobre secuencias de (0, 1, 2)

Tarea: contar cuántas secuencias de longitud nn existen formadas solo por los números 0,1,20,1,2 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 Ai(i=0,1,2)A_i (i = 0,1,2) el conjunto de secuencias en las que el dígito ii no ocurre. La fórmula de inclusión-exclusión para el número de secuencias “malas” será:

A0A1A2=A0+A1+A2A0A1A0A2A1A2+A0A1A2 |A_0 \cup A_1 \cup A_2| = |A_0| + |A_1| + |A_2| - |A_0 \cap A_1| - |A_0 \cap A_2| - |A_1 \cap A_2| + |A_0 \cap A_1 \cap A_2|

  • El tamaño de cada AiA_i es 2n2^n, porque cada secuencia solo puede contener dos de los dígitos.
  • El tamaño de cada intersección por pares AiAjA_i \cap A_j es igual a 11, 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 00, porque no habrá dígitos con los que construir la secuencia.

Como resolvimos el problema inverso, lo restamos del total de 3n3^n secuencias:

3n(32n31+0)3^n - (3 \cdot 2^n - 3 \cdot 1 + 0)

### Número de sumas de enteros con cota superior {: #number-of-upper-bound-integer-sums }

Consideremos la siguiente ecuación:

x1+x2+x3+x4+x5+x6=20x_1 + x_2 + x_3 + x_4 + x_5 + x_6 = 20

donde 0xi8 (i=1,2,6)0 \le x_i \le 8 ~ (i = 1,2,\ldots 6).

Tarea: contar el número de soluciones de la ecuación.

Olvidemos por un momento la restricción sobre xix_i 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 2020 unidades en 66 grupos, lo que es lo mismo que disponer 55 barras y 2020 estrellas:

N0=(255)N_0 = \binom{25}{5}

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 xix_i son mayores o iguales que 99.

Denotemos por Ak (k=1,26)A_k ~ (k = 1,2\ldots 6) el conjunto de soluciones donde xk9x_k \ge 9, y todos los demás xi0 (ik)x_i \ge 0 ~ (i \ne k) (pueden ser 9\ge 9 o no). Para calcular el tamaño de AkA_k, nótese que esencialmente tenemos el mismo problema combinatorio que se resolvió en los dos párrafos anteriores, pero ahora 99 de las unidades se excluyen de las ranuras y pertenecen definitivamente al primer grupo. Así:

Ak=(165) | A_k | = \binom{16}{5}

De manera similar, el tamaño de la intersección entre dos conjuntos AkA_k y ApA_p (para kpk \ne p) es igual a:

AkAp=(75) \left| A_k \cap A_p \right| = \binom{7}{5}

El tamaño de cada intersección de tres conjuntos es cero, porque 2020 unidades no alcanzarán para tres o más variables mayores o iguales que 99.

Combinando todo esto en la fórmula de inclusión-exclusión y dado que resolvimos el problema inverso, obtenemos por fin la respuesta:

(255)((61)(165)(62)(75))\binom{25}{5} - \left(\binom{6}{1} \cdot \binom{16}{5} - \binom{6}{2} \cdot \binom{7}{5}\right)

Esto se generaliza fácilmente a dd números que suman ss con la restricción 0xib0 \le x_i \le b:

i=0d(1)i(di)(s+d1(b+1)id1)\sum_{i=0}^d (-1)^i \binom{d}{i} \binom{s+d-1-(b+1)i}{d-1}

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 O(d)O(d) (suponiendo que las operaciones matemáticas como el coeficiente binomial son de tiempo constante), mientras que un enfoque de DP sencillo tomaría tiempo O(ds)O(ds).

El número de coprimos en un intervalo dado

Tarea: dados dos números nn y rr, contar el número de enteros en el intervalo [1;r][1;r] que son coprimos con nn (su máximo común divisor es 11).

Resolvamos el problema inverso: calcular el número de enteros que no son coprimos con nn.

Denotaremos los factores primos de nn como pi(i=1k)p_i (i = 1\cdots k).

¿Cuántos números en el intervalo [1;r][1;r] son divisibles por pip_i? La respuesta a esta pregunta es:

rpi \left\lfloor \frac{ r }{ p_i } \right\rfloor

Sin embargo, si simplemente sumamos estos números, algunos se contarán varias veces (aquellos que comparten varios pip_i como factores). Por lo tanto, es necesario usar el principio de inclusión-exclusión.

Iteraremos sobre todos los 2k2^k subconjuntos de los pip_i, 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 O(n)O (\sqrt{n}).

El número de enteros en un intervalo dado que son múltiplos de al menos uno de los números dados

Dados nn números aia_i y un número rr. Se quiere contar el número de enteros en el intervalo [1;r][1; r] que son múltiplos de al menos uno de los aia_i.

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 aia_i, es decir, cada término de esta fórmula es el número de números divisibles por un subconjunto dado de números aia_i (en otras palabras, divisibles por su mínimo común múltiplo).

Así que ahora iteraremos sobre todos los 2n2^n subconjuntos de enteros aia_i con O(nlogr)O(n \log r) 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 O(2nnlogr)O (2^n\cdot n\cdot \log r).

El número de strings que satisfacen un patrón dado

Consideremos nn patrones de strings de la misma longitud, formados solo por letras (a...za…z) o signos de interrogación. También se da un número kk. 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 kk de los patrones (primer problema) y con al menos kk 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 aa a zz. 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 kk de los patrones.

Para resolverlo, iteramos y fijamos un subconjunto específico XX del conjunto de patrones formado por kk 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 YY (subconjuntos del conjunto original de strings que contienen a XX), y o bien sumamos a la respuesta actual o la restamos del número de strings:

ans(X)=YX(1)Ykf(Y) ans(X) = \sum_{Y \supseteq X} (-1)^{|Y|-k} \cdot f(Y)

Donde f(Y)f(Y) es el número de strings que coinciden con YY (al menos YY).

(Si cuesta visualizar esto, se pueden dibujar diagramas de Venn.)

Si sumamos sobre todos los ans(X)ans(X), obtendremos la respuesta final:

ans=X : X=kans(X) ans = \sum_{X ~ : ~ |X| = k} ans(X)

Sin embargo, la cota asintótica de esta solución es O(3kk)O(3^k \cdot k). Para mejorarla, nótese que distintos cálculos de ans(X)ans(X) comparten muy a menudo conjuntos YY.

Invertiremos la fórmula de inclusión-exclusión y sumaremos en términos de conjuntos YY. Ahora queda claro que el mismo conjunto YY se tendría en cuenta en el cálculo de ans(X)ans(X) de (Yk)\binom{|Y|}{k} conjuntos con el mismo signo (1)Yk(-1)^{|Y| - k}.

ans=Y : Yk(1)Yk(Yk)f(Y) ans = \sum_{Y ~ : ~ |Y| \ge k} (-1)^{|Y|-k} \cdot \binom{|Y|}{k} \cdot f(Y)

Ahora nuestra solución tiene cota asintótica O(2kk)O(2^k \cdot k).

Resolveremos ahora la segunda versión del problema: hallar el número de strings que coinciden con al menos kk 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 kk. Sin embargo, se puede notar que en este problema un conjunto Y|Y| se considera en la fórmula para todos los conjuntos de tamaño k\ge k que están contenidos en YY. Dicho esto, podemos escribir la parte de la expresión que se multiplica por f(Y)f(Y) como:

(1)Yk(Yk)+(1)Yk1(Yk+1)+(1)Yk2(Yk+2)++(1)YY(YY) (-1)^{|Y|-k} \cdot \binom{|Y|}{k} + (-1)^{|Y|-k-1} \cdot \binom{|Y|}{k+1} + (-1)^{|Y|-k-2} \cdot \binom{|Y|}{k+2} + \cdots + (-1)^{|Y|-|Y|} \cdot \binom{|Y|}{|Y|}

Mirando el libro de Graham (Graham, Knuth, Patashnik. “Concrete mathematics” [1998] ), vemos una fórmula conocida para coeficientes binomiales:

k=0m(1)k(nk)=(1)m(n1m) \sum_{k=0}^m (-1)^k \cdot \binom{n}{k} = (-1)^m \cdot \binom{n-1}{m}

Aplicándola aquí, encontramos que toda la suma de coeficientes binomiales se reduce a:

(1)Yk(Y1Yk) (-1)^{|Y|-k} \cdot \binom{|Y|-1}{|Y|-k}

Así, para esta tarea también obtuvimos una solución con cota asintótica O(2kk)O(2^k \cdot k):

ans=Y : Yk(1)Yk(Y1Yk)f(Y) ans = \sum_{Y ~ : ~ |Y| \ge k} (-1)^{|Y|-k} \cdot \binom{|Y|-1}{|Y|-k} \cdot f(Y)

El número de formas de ir de una celda a otra

Hay un tablero n×mn \times m, y kk de sus celdas son paredes intransitables. Un robot está inicialmente en la celda (1,1)(1,1) (abajo a la izquierda). El robot solo puede moverse a la derecha o hacia arriba, y eventualmente necesita llegar a la celda (n,m)(n,m), evitando todos los obstáculos. Hay que contar el número de formas en que puede hacerlo.

Supongamos que los tamaños nn y mm son muy grandes (por ejemplo, 10910^9), y el número kk es pequeño (alrededor de 100100).

Por ahora, ordenemos los obstáculos por su coordenada xx y, en caso de empate, por la coordenada yy.

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 xx celdas y en el otro, yy celdas. Por combinatoria elemental, obtenemos una fórmula usando coeficientes binomiales:

(x+yx)\binom{x+y}{x}

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 O(2kk)O(2^k \cdot k).

Aquí va una solución polinomial:

Usaremos programación dinámica. Por conveniencia, insertamos (1,1)(1,1) al principio y (n,m)(n,m) al final del arreglo de obstáculos. Calculemos los números d[i]d[i]: el número de formas de ir del punto de partida (00-ésimo) al ii-ésimo, sin pisar ningún otro obstáculo (excepto ii, 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 00 a ii. Hay que considerar algunos caminos “malos”, los que pasan por los obstáculos, y restarlos del número total de formas de ir de 00 a ii.

Al considerar un obstáculo tt entre 00 e ii (0<t<i0 < t < i) sobre el que podemos pisar, vemos que el número de caminos de 00 a ii que pasan por tt y que tienen a tt como el primer obstáculo entre el inicio e ii. Podemos calcularlo como: d[t]d[t] multiplicado por el número de caminos arbitrarios de tt a ii. Podemos contar el número de formas “malas” sumando esto para todo tt entre 00 e ii.

Podemos calcular d[i]d[i] en O(k)O(k) para O(k)O(k) obstáculos, así que esta solución tiene complejidad O(k2)O(k^2).

El número de cuádruplas coprimas

Se dan nn números: a1,a2,,ana_1, a_2, \ldots, a_n. 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 d>1d > 1.

Usaremos el principio de inclusión-exclusión sumando sobre todos los grupos posibles de cuatro números divisibles por un divisor dd.

ans=d2(1)deg(d)1f(d)ans = \sum_{d \ge 2} (-1)^{deg(d)-1} \cdot f(d)

donde deg(d)deg(d) es el número de primos en la factorización del número dd y f(d)f(d) el número de cuádruplas divisibles por dd.

Para calcular la función f(d)f(d), basta contar el número de múltiplos de dd (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 n106n \le 10^6. Se pide contar el número de ternas 2a<b<cn2 \le a < b < c \le n que satisfacen una de las siguientes condiciones:

  • o bien gcd(a,b)=gcd(a,c)=gcd(b,c)=1{\rm gcd}(a,b) = {\rm gcd}(a,c) = {\rm gcd}(b,c) = 1,
  • o bien gcd(a,b)>1,gcd(a,c)>1,gcd(b,c)>1{\rm gcd}(a,b) > 1, {\rm gcd}(a,c) > 1, {\rm gcd}(b,c) > 1.

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 ii es igual al número de enteros de 22 a nn que son coprimos con ii multiplicado por el número de enteros que no son coprimos con ii.

O bien gcd(a,b)=1gcd(a,c)>1gcd(b,c)>1gcd(a,b) = 1 \wedge gcd(a,c) > 1 \wedge gcd(b,c) > 1

o bien gcd(a,b)=1gcd(a,c)=1gcd(b,c)>1gcd(a,b) = 1 \wedge gcd(a,c) = 1 \wedge gcd(b,c) > 1

En ambos casos se contará dos veces. El primer caso se contará cuando i=ai = a y cuando i=bi = b. El segundo caso se contará cuando i=bi = b y cuando i=ci = c. Por lo tanto, para calcular el número de ternas no armónicas, sumamos este cálculo para todo ii de 22 a nn y lo dividimos por 22.

Ahora solo nos queda aprender a contar el número de coprimos con ii en el intervalo [2;n][2;n]. 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 22 a nn, 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:

  1. Primero, hallamos todos los números en el intervalo [2;n][2;n] 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 deg[i]deg[i] para guardar el número de primos en la factorización de ii, y un arreglo good[i]good[i], para marcar si ii contiene cada factor a lo sumo una vez (good[i]=1good[i] = 1) o no (good[i]=0good[i] = 0). Al iterar de 22 a nn, si llegamos a un número que tiene degdeg igual a 00, entonces es primo y su degdeg es 11.
    • Durante la criba de Eratóstenes, iteraremos ii de 22 a nn. Al procesar un número primo recorremos todos sus múltiplos y aumentamos su deg[]deg[]. Si uno de estos múltiplos es múltiplo del cuadrado de ii, entonces podemos poner goodgood como falso.
  2. Segundo, necesitamos calcular la respuesta para todo ii de 22 a nn, es decir, el arreglo cnt[]cnt[]: el número de enteros no coprimos con ii.

    • 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 ii tal que good[i]=truegood[i] = true, es decir, interviene en la fórmula de inclusión-exclusión. Iteramos por todos los números que son múltiplos de ii, y o bien sumamos o restamos N/i\lfloor N/i \rfloor de su cnt[]cnt[] (el signo depende de deg[i]deg[i]: si deg[i]deg[i] 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 O(nlogn)O(n \log n), porque para casi todo número hasta nn hacemos n/in/i iteraciones en el bucle anidado.

El número de permutaciones sin puntos fijos (desarreglos)

Probar que el número de permutaciones de longitud nn sin puntos fijos (es decir, ningún número ii está en la posición ii; también llamadas desarreglos o derangements) es igual al siguiente número:

n!(n1)(n1)!+(n2)(n2)!(n3)(n3)!+±(nn)(nn)!n! - \binom{n}{1} \cdot (n-1)! + \binom{n}{2} \cdot (n-2)! - \binom{n}{3} \cdot (n-3)! + \cdots \pm \binom{n}{n} \cdot (n-n)!

y aproximadamente igual a:

n!e \frac{ n! }{ e }

(si se redondea esta expresión al entero más cercano, se obtiene exactamente el número de permutaciones sin puntos fijos)

Denotemos por AkA_k el conjunto de permutaciones de longitud nn con un punto fijo en la posición kk (1kn1 \le k \le n) (es decir, el elemento kk está en la posición kk).

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 AiA_i, como sigue:

\begin{eqnarray} \left| A_p \right| &amp;=&amp; (n-1)!\ , \ \left| A_p \cap A_q \right| &amp;=&amp; (n-2)!\ , \ \left| A_p \cap A_q \cap A_r \right| &amp;=&amp; (n-3)!\ , \ \cdots , \end{eqnarray}

porque si sabemos que el número de puntos fijos es igual a xx, entonces conocemos la posición de xx elementos de la permutación, y los demás (nx)(n-x) 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 xx del conjunto de nn elementos es igual a (nx)\binom{n}{x}, obtenemos una fórmula para el número de permutaciones con al menos un punto fijo:

(n1)(n1)!(n2)(n2)!+(n3)(n3)!±(nn)(nn)!\binom{n}{1} \cdot (n-1)! - \binom{n}{2} \cdot (n-2)! + \binom{n}{3} \cdot (n-3)! - \cdots \pm \binom{n}{n} \cdot (n-n)!

Entonces el número de permutaciones sin puntos fijos es igual a:

n!(n1)(n1)!+(n2)(n2)!(n3)(n3)!+±(nn)(nn)!n! - \binom{n}{1} \cdot (n-1)! + \binom{n}{2} \cdot (n-2)! - \binom{n}{3} \cdot (n-3)! + \cdots \pm \binom{n}{n} \cdot (n-n)!

Simplificando esta expresión, obtenemos expresiones exactas y aproximadas para el número de permutaciones sin puntos fijos:

n!(111!+12!13!+±1n!)n!e n! \left( 1 - \frac{1}{1!} + \frac{1}{2!} - \frac{1}{3!} + \cdots \pm \frac{1}{n!} \right ) \approx \frac{n!}{e}

(porque la suma entre paréntesis son los primeros n+1n+1 términos de la expansión en serie de Taylor de e1e^{-1})

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 mm 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 kk, en lugar de nn.

Problemas de práctica

Una lista de tareas que se pueden resolver usando el principio de inclusión-exclusión: