El número total de elementos en el producto cartesiano de dos conjuntos y es igual al producto del número de elementos en y en , es decir:
En palabras más sencillas: si tenemos formas de realizar la Tarea 1 y formas de realizar la Tarea 2, entonces el número total de formas de hacer ambas tareas es igual a .
En general, si hay tareas y la -ésima tarea se puede realizar de maneras, entonces hay formas de hacer todas las tareas.
Ejemplo:
Imagina que tienes 3 sombreros diferentes, 2 camisas diferentes y 4 pantalones diferentes. Quieres vestirte y, para ello, debes usar 1 sombrero, 1 camisa y 1 pantalón. ¿De cuántas maneras puedes hacerlo?
Solución:
Los 4 Tipos de Permutaciones
Permutación con repetición
Cuando se pueden repetir elementos en cada posición de la permutación. Ejemplo: ¿Cuántos números de 3 dígitos mayores que 500 se pueden formar con los dígitos 3, 4, 5 y 7? Solución: El primer dígito debe ser 5 o 7 (2 opciones), y los otros 2 pueden repetirse (4 opciones cada uno). Total de permutaciones: .
Permutación sin repetición
Cuando no se permiten repeticiones y cada elemento solo puede aparecer una vez en la permutación. Ejemplo: ¿Cuántos números de 3 dígitos divisibles por 3 se pueden formar con los dígitos 2, 4, 6 y 8 sin repetición? Solución: La suma de los dígitos debe ser divisible por 3. Existen dos combinaciones posibles (2, 4, 6 y 4, 6, 8), con permutaciones cada una. Total: .
r-permutación sin repetición
Disposición de r elementos de un total de n, sin repetir ningún elemento. Ejemplo: Una heladería tiene 10 sabores. ¿Cuántas combinaciones de 3 sabores diferentes se pueden hacer? Solución: Para el primer sabor hay 10 opciones, para el segundo 9, y para el tercero 8. Total: . Fórmula general: .
r-permutación con repetición
Disposición de n elementos en r posiciones, permitiendo que los elementos se repitan. Ejemplo: Un policía visita una escena del crimen 3 veces a la semana. ¿Cuántas maneras hay de programar sus visitas sin restricción de días? Solución: Para cada visita hay 7 opciones (uno por día de la semana). Total de maneras: .
Definición de Combinatoria
En combinatoria, una combinación de un conjunto de objetos distintos es simplemente el conteo de formas en las que se pueden seleccionar un número específico de elementos de un conjunto de cierto tamaño. En una combinación, el orden de los elementos no importa. Una selección no ordenada de r elementos de un conjunto se llama una r-combinación y se representa como .
Dado que una combinación es simplemente una permutación sin orden, el número de r-combinaciones se puede expresar en términos de r-permutaciones. La r-permutación se puede obtener al primero calcular la r-combinación y luego ordenar los elementos en cada r-combinación, lo cual se puede hacer de maneras.
La relación es:
Usando esta relación, la fórmula para $ C(n, r) $ se obtiene como:
Así, el número de combinaciones de r elementos de un conjunto de n se calcula usando la fórmula:
Ejemplo de combinatoria
Como ejemplo, consideremos el problema de contar el número de formas de representar un número entero como una suma de enteros positivos. Por ejemplo, hay 8 representaciones para el número 4:
Un problema combinatorio como este se puede resolver a menudo usando una función recursiva. En este caso, podemos definir una función que da el número de representaciones de . Según el ejemplo anterior, . Los valores de la función pueden calcularse recursivamente de la siguiente manera:
El caso base es , porque la suma vacía representa el número 0. Luego, si , consideramos todas las formas de elegir el primer número de la suma. Si el primer número es , hay representaciones para la parte restante de la suma. Así, calculamos la suma de todos los valores de la forma donde .
Los primeros valores de la función son:
A veces, una fórmula recursiva puede reemplazarse por una fórmula de forma cerrada. En este problema, la función se puede expresar como:
Esta fórmula se basa en el hecho de que hay posiciones posibles para colocar los signos "+" en la suma, y podemos elegir cualquier subconjunto de esas posiciones.
Coeficientes binomiales
El coeficiente binomial (pronunciado como "n elige k" o, a veces, escrito como ) representa el número de maneras de elegir un subconjunto de elementos de un conjunto de elementos. Por ejemplo, , porque el conjunto (set) tiene subconjuntos (subsets) de elementos:
Hay dos formas de calcular coeficientes binomiales:
Ahora veremos la implementación del segundo metodo, ya que es más probable que un problema de coeficientes binomiales tenga numeros grandes y modulos a que sea uno sencillo capaz de correr en .
constint MAXN = 1e6; constint MOD = 1e9 + 7;
vector<ll> fac(MAXN + 1); vector<ll> inv(MAXN + 1);
ll exp(ll x, ll n, ll m){
x %= m;
ll res = 1;
while (n > 0) {
if (n % 2 == 1) { res = res * x % m; }
x = x * x % m;
n >>= 1;// n /=2
}
return res;
}
voidfactorial(){
fac[0] = 1;
for (int i = 1; i <= MAXN; i++) { fac[i] = fac[i - 1] * i % MOD; }
}
voidinverses(){
inv[MAXN] = exp(fac[MAXN], MOD - 2, MOD);
for (int i = MAXN; i >= 1; i--) { inv[i - 1] = inv[i] * i % MOD; }
}
ll choose(int n, int r){ return fac[n] * inv[r] % MOD * inv[n - r] % MOD; }
Codigo principal
intmain(){
factorial();
inverses();
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int a, b;
cin >> a >> b;
cout << choose(a, b) << '\n';
}
}
Derangements: Inclusion-exclusion principle
Supongamos que tenemos eventos , donde el evento corresponde a que la persona recibe su propio sombrero. Queremos calcular .
Restamos de el número de formas en las que puede ocurrir cada evento; es decir, consideremos la cantidad . Esto subcuenta, ya que estamos restando los casos donde ocurren más de un evento demasiadas veces. Específicamente, para una permutación donde ocurren al menos dos eventos, subcontamos una vez. Entonces, añadimos de nuevo el número de formas en las que ocurren dos eventos. Podemos continuar este proceso para cada tamaño de subconjunto de índices. La expresión queda como:
Para un conjunto de tamaño , el número de permutaciones con al menos índices se puede calcular eligiendo un conjunto de tamaño que sea fijo y permutando los otros índices. En términos matemáticos
Entonces, el problema se reduce a calcular:
En código se vería así:
intmain(){
int n, m;
cin >> n >> m;
int c = 1; // Start with c = 1for (int i = 1; i <= n; i++) {
c = (1LL * c * i) % m; // Multiply by i and take mod m
c = (c + (i % 2 == 1 ? -1 : 1) + m) % m; // Add -1 or +1, and take mod m to handle negatives
cout << c << ' ';
}
cout << endl;
}
Principio del Palomar (Pigeonhole Principle)
El principio del palomar establece que si distribuimos palomas en nidos y , al menos un nido contendrá más de una paloma. En otras palabras, si tienes más objetos que contenedores en los cuales colocarlos, al menos un contenedor debe tener más de un objeto. Este principio se basa en la analogía de palomas (objetos) colocadas en agujeros de palomar (contenedores).
Versión Generalizada del Principio del Palomar
La versión generalizada del principio dice que si distribuimos palomas en nidos, donde , entonces al menos un nido contendrá al menos palomas. Este principio simple tiene numerosas aplicaciones en problemas de combinatoria y teoría de números, aunque a veces no es evidente identificar cómo aplicarlo correctamente, ya que puede ser difícil reconocer qué representan los "nidos" y las "palomas" en cada problema.
Ejemplos del Principio del Palomar
Ejemplo de bolas de colores: Supongamos que tenemos una bolsa con bolas de cinco colores diferentes. ¿Cuál es el número mínimo de bolas que debemos extraer, sin mirarlas, para asegurar que obtenemos dos bolas del mismo color?
Aplicación: Aquí, los "nidos" representan los colores de las bolas. Dado que hay cinco colores (5 nidos), si extraemos 6 bolas, al menos dos de ellas serán del mismo color.
Ejemplo de equipos de fútbol: Imagina que equipos de fútbol juegan partidos cada fin de semana, enfrentándose todos contra todos. Demuestra que, al final de cada fin de semana, siempre hay dos equipos que han jugado el mismo número de partidos.
Aplicación: Aquí, los "nidos" son las posibles cantidades de partidos que un equipo ha jugado hasta el momento, desde 0 (si no ha jugado) hasta (si ha jugado contra todos los demás). Sin embargo, los valores 0 y son incompatibles porque no puede haber un equipo que haya jugado contra todos mientras otro no ha jugado ningún partido. Por lo tanto, el número de nidos efectivos es . Con equipos y solo nidos posibles, el principio del palomar asegura que al menos dos equipos han jugado el mismo número de partidos.
Numeros de Catalan
Los números de Catalán son una secuencia de números enteros positivos que se utilizan para contar diversas combinaciones posibles en problemas combinatorios. La fórmula general para el término es:
Alternativamente, cada número de Catalán también puede calcularse a partir del término anterior usando:
Los primeros números de Catalán para son: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …
Los números de Catalán aparecen en muchos problemas de conteo interesantes, tales como:
Contar el número de expresiones con pares de paréntesis correctamente emparejados. Por ejemplo, para , las expresiones posibles son .
Contar el número de árboles de búsqueda binarios posibles con claves.
Contar el número de árboles binarios completos con hojas.
Dado un número , contar el número de formas de dibujar cuerdas en un círculo con puntos de manera que no se crucen dos cuerdas.
Algoritmo para imprimir los primeros n numeros de Catalan
voidcatalan(int n){
int res = 1;
cout << res << " ";
// Iterate till nfor (int i = 1; i < n; i++) {
// Calculate the ith Catalan number
res = (res * (4 * i - 2)) / (i + 1);
cout << res << " ";
}
}// O(n)intmain(){
int n = 10;
catalan(n);
return0;
}