Problem Summary

An urn contains \(C\) colors, each represented by \(B\) balls, so the total number of balls is \(CB\). We draw \(D\) balls uniformly without replacement and ask for the expected number of distinct colors that appear in the sample. For Problem 493, the concrete parameters are \((C,B,D)=(7,10,20)\).

Mathematical Approach

Let \(X\) be the number of distinct colors seen in the draw. The key observation is that the expectation can be reduced to a single probability about one fixed color, and that probability is a simple hypergeometric complement.

Step 1: Model the Random Variable

For each color \(j\in\{1,\dots,C\}\), define an indicator variable \(I_j\) that equals \(1\) if color \(j\) appears at least once in the sample and equals \(0\) otherwise. Then the number of distinct colors is

$$X=\sum_{j=1}^{C} I_j.$$

This reformulation turns a seemingly global counting question into a sum of very small yes-or-no events, one event for each color.

Step 2: Apply Linearity of Expectation

Taking expectations gives

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

No independence is needed here; linearity of expectation always holds. By symmetry, every color has the same chance to appear. If we write

$$p=\Pr(I_1=1),$$

then

$$\mathbb{E}[X]=Cp.$$

So the whole problem is reduced to finding the appearance probability of one fixed color.

Step 3: Count the Complementary Event

It is easier to compute the probability that the chosen color does not appear. The total number of equally likely samples of size \(D\) is

$$\binom{CB}{D}.$$

If one particular color is missing, then all \(D\) drawn balls must come from the other \(C-1\) colors, which contribute \((C-1)B\) balls altogether. Therefore

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Since \(p=1-q\), we obtain

$$p=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Step 4: Derive the Closed Formula

Substituting \(p\) into \(\mathbb{E}[X]=Cp\) yields the exact expectation

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

For the Project Euler parameters, this becomes

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

This formula is already the mathematical solution. The remaining task is simply to evaluate it numerically in a stable way.

Step 5: Rewrite the Binomial Ratio as a Product

Directly forming the two large binomial coefficients is unnecessary. Using falling products,

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!},$$

so for any \(A\) and \(N\) with \(A\le N\) we have

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

With \(A=(C-1)B\) and \(N=CB\), the missing-color probability is therefore

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

This product form is exactly what the implementations use, because it avoids huge intermediate values and matches floating-point arithmetic naturally.

Worked Example: \((C,B,D)=(3,2,2)\)

This small case is easy to verify by hand. There are \(3\) colors with \(2\) balls each, so \(6\) balls in total. For one fixed color, the probability that it is absent from the two draws is

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

Hence

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

A direct enumeration confirms this. Among the \(\binom{6}{2}=15\) equally likely pairs, exactly \(3\) pairs have both balls of the same color and the remaining \(12\) pairs have two different colors, so

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

How the Code Works

The C++, Python, and Java implementations all use the same formula. They first compute the total number of balls \(CB\) and the number of balls that remain after excluding one fixed color, namely \((C-1)B\).

They then evaluate the product

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

term by term. Each iteration contributes one factor to the probability that the chosen color is missing from the sample.

After that, the implementation takes the complement of this probability and multiplies by \(C\):

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

The result is printed to nine digits after the decimal point. The C++ implementation also performs small sanity checks, including the toy example above and the edge case \(D=0\), before printing the final value.

Complexity Analysis

For general parameters, the method performs exactly \(D\) multiplicative updates, so the running time is \(O(D)\) and the extra memory usage is \(O(1)\). For the actual problem instance \(D=20\), the computation is tiny. The important point is that the algorithm never enumerates samples and never builds large combinatorial tables.

Footnotes and References

  1. Problem page: https://projecteuler.net/problem=493
  2. Hypergeometric distribution: Wikipedia — Hypergeometric distribution
  3. Indicator function and indicator variables: Wikipedia — Indicator function
  4. Expected value and linearity: Wikipedia — Expected value
  5. Binomial coefficient: Wikipedia — Binomial coefficient

Problemzusammenfassung

Eine Urne enthält \(C\) Farben, von jeder Farbe genau \(B\) Kugeln, also insgesamt \(CB\) Kugeln. Es werden \(D\) Kugeln gleichwahrscheinlich ohne Zurücklegen gezogen. Gesucht ist der Erwartungswert der Anzahl verschiedener Farben in der Stichprobe. Für Problem 493 gelten die Werte \((C,B,D)=(7,10,20)\).

Mathematischer Ansatz

Sei \(X\) die Zahl der verschiedenen beobachteten Farben. Der entscheidende Trick besteht darin, den Erwartungswert mit Hilfe von Indikatorvariablen auf genau eine Wahrscheinlichkeit für eine feste Farbe zu reduzieren; diese Wahrscheinlichkeit ist ein einfaches hypergeometrisches Komplement.

Schritt 1: Die Zufallsvariable modellieren

Für jede Farbe \(j\in\{1,\dots,C\}\) definieren wir eine Indikatorvariable \(I_j\), die den Wert \(1\) annimmt, wenn Farbe \(j\) mindestens einmal vorkommt, und sonst den Wert \(0\). Dann ist

$$X=\sum_{j=1}^{C} I_j.$$

Damit wird aus einer globalen Fragestellung eine Summe vieler kleiner Ja-Nein-Ereignisse, jeweils eines pro Farbe.

Schritt 2: Linearität des Erwartungswerts anwenden

Durch Erwartungsbildung erhält man

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

Dazu ist keine Unabhängigkeit nötig; die Linearität gilt immer. Wegen der Symmetrie haben alle Farben dieselbe Auftretenswahrscheinlichkeit. Mit

$$p=\Pr(I_1=1)$$

folgt daher

$$\mathbb{E}[X]=Cp.$$

Somit muss nur noch berechnet werden, wie wahrscheinlich das Auftreten einer fest gewählten Farbe ist.

Schritt 3: Das Komplementereignis zählen

Einfacher ist die Gegenwahrscheinlichkeit: Wie wahrscheinlich ist es, dass die gewählte Farbe gar nicht erscheint? Insgesamt gibt es

$$\binom{CB}{D}$$

gleichwahrscheinliche Stichproben der Größe \(D\). Fehlt eine bestimmte Farbe vollständig, dann müssen alle \(D\) gezogenen Kugeln aus den übrigen \(C-1\) Farben stammen, also aus insgesamt \((C-1)B\) Kugeln. Daher gilt

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Wegen \(p=1-q\) erhält man

$$p=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Schritt 4: Die geschlossene Formel herleiten

Setzt man \(p\) in \(\mathbb{E}[X]=Cp\) ein, so ergibt sich

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

Für die Euler-Parameter wird daraus

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

Damit ist die Mathematik im Wesentlichen abgeschlossen; anschließend muss dieser Ausdruck nur noch numerisch stabil ausgewertet werden.

Schritt 5: Den Binomialquotienten als Produkt schreiben

Es ist unnötig, die beiden großen Binomialkoeffizienten separat auszurechnen. Mit der fallenden Produktdarstellung

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!}$$

folgt für beliebige \(A\) und \(N\) mit \(A\le N\)

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

Mit \(A=(C-1)B\) und \(N=CB\) ergibt sich also

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

Genau diese Produktform verwenden die Implementierungen, weil dadurch keine riesigen Zwischenwerte entstehen und Fließkommaarithmetik direkt ausreicht.

Durchgerechnetes Beispiel: \((C,B,D)=(3,2,2)\)

Dieser kleine Fall lässt sich vollständig von Hand prüfen. Es gibt \(3\) Farben mit jeweils \(2\) Kugeln, also insgesamt \(6\) Kugeln. Für eine feste Farbe ist die Wahrscheinlichkeit ihres Fehlens in zwei Zügen

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

Damit gilt

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

Direkte Enumeration liefert denselben Wert. Unter den \(\binom{6}{2}=15\) möglichen Paaren sind genau \(3\) einfarbig, die übrigen \(12\) enthalten zwei verschiedene Farben. Also

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

Wie der Code funktioniert

Die C++-, Python- und Java-Implementierungen verwenden alle dieselbe Formel. Zuerst berechnen sie die Gesamtzahl der Kugeln \(CB\) sowie die Zahl \((C-1)B\) der Kugeln, die nach dem Ausschluss einer festen Farbe übrig bleiben.

Anschließend werten sie das Produkt

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

termweise aus. Jede Schleifeniteration liefert genau einen Faktor zur Wahrscheinlichkeit, dass die gewählte Farbe fehlt.

Danach wird das Komplement gebildet und mit \(C\) multipliziert:

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

Das Ergebnis wird mit neun Nachkommastellen ausgegeben. Die C++-Implementierung prüft zusätzlich einen kleinen Handtest und den Randfall \(D=0\), bevor sie den Endwert ausgibt.

Komplexitätsanalyse

Für allgemeine Parameter benötigt die Methode genau \(D\) multiplikative Aktualisierungen. Damit beträgt die Laufzeit \(O(D)\) und der Zusatzspeicher \(O(1)\). Beim eigentlichen Problem ist \(D=20\), also ist die numerische Arbeit verschwindend klein. Entscheidend ist, dass weder Stichproben enumeriert noch große kombinatorische Tabellen aufgebaut werden.

Fußnoten und Referenzen

  1. Problemseite: https://projecteuler.net/problem=493
  2. Hypergeometrische Verteilung: Wikipedia — Hypergeometrische Verteilung
  3. Indikatorfunktion und Indikatorvariablen: Wikipedia — Indikatorfunktion
  4. Erwartungswert und Linearität: Wikipedia — Erwartungswert
  5. Binomialkoeffizient: Wikipedia — Binomialkoeffizient

Problem Özeti

Bir torbada \(C\) farklı renk vardır ve her renkten \(B\) adet top bulunur; toplam top sayısı \(CB\)'dir. Geri koymadan eşit olasılıkla \(D\) top çekiyoruz ve örnekte görülen farklı renk sayısının beklenen değerini istiyoruz. Problem 493 için parametreler \((C,B,D)=(7,10,20)\) şeklindedir.

Matematiksel Yaklaşım

\(X\), çekilişte görülen farklı renk sayısı olsun. Ana fikir, beklenen değeri her renk için tanımlanan gösterge değişkenlerine ayırmak ve böylece problemi tek bir sabit rengin görünme olasılığına indirmektir. Bu olasılık da basit bir hipergeometrik tamamlayıcı olayla hesaplanır.

Adım 1: Rastgele Değişkeni Modellemek

Her \(j\in\{1,\dots,C\}\) rengi için \(I_j\) gösterge değişkenini tanımlayalım. Bu değişken, renk \(j\) en az bir kez görülürse \(1\), hiç görülmezse \(0\) değerini alır. O halde farklı renk sayısı

$$X=\sum_{j=1}^{C} I_j$$

olur. Böylece küresel bir sayım problemi, renk başına birer küçük evet-hayır olayına ayrılmış olur.

Adım 2: Beklenen Değerin Lineerliğini Kullanmak

Beklenen değer alırsak

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1)$$

elde ederiz. Burada bağımsızlık gerekmez; lineerlik her zaman geçerlidir. Simetri nedeniyle bütün renklerin görünme olasılığı aynıdır. Eğer

$$p=\Pr(I_1=1)$$

dersek, doğrudan

$$\mathbb{E}[X]=Cp$$

sonucuna ulaşırız. Yani artık tek yapılması gereken, sabit bir rengin en az bir kez görülme olasılığını bulmaktır.

Adım 3: Tamamlayıcı Olayı Saymak

Bunu doğrudan hesaplamak yerine sabit rengin hiç görünmeme olasılığını bulmak daha kolaydır. Toplam \(D\) topluk örnek sayısı

$$\binom{CB}{D}$$

kadardır. Seçilen bir rengin hiç gelmemesi için tüm çekilişlerin geri kalan \(C-1\) renkten gelmesi gerekir; bu renklerde toplam \((C-1)B\) top vardır. Dolayısıyla

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}$$

olur. Buradan

$$p=1-q=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}$$

elde edilir.

Adım 4: Kapalı Formülü Elde Etmek

\(p\) değerini \(\mathbb{E}[X]=Cp\) eşitliğine koyunca tam formül çıkar:

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

Euler parametreleri için bu

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right)$$

şeklini alır. Matematiksel çözüm aslında burada bitmiş olur; geriye sadece bu ifadeyi sayısal olarak güvenli biçimde hesaplamak kalır.

Adım 5: Kombinasyon Oranını Bir Çarpım Olarak Yazmak

İki büyük kombinasyonu ayrı ayrı hesaplamaya gerek yoktur. Düşen çarpım gösterimini kullanırsak

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!}$$

olduğundan, \(A\le N\) için

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}$$

yazabiliriz. Burada \(A=(C-1)B\) ve \(N=CB\) alınırsa

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

elde edilir. Uygulama tam olarak bu biçimi kullanır; çünkü çok büyük ara değerler oluşmaz ve kayan nokta hesabı yeterlidir.

Çözümlü Örnek: \((C,B,D)=(3,2,2)\)

Bu küçük örnek elle doğrulanabilir. \(3\) renk ve her renkten \(2\) top olduğundan toplam \(6\) top vardır. Sabit bir rengin iki çekilişte hiç gelmeme olasılığı

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}$$

olur. O halde

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

Doğrudan sayım da aynı sonucu verir. \(\binom{6}{2}=15\) olası ikilinin yalnızca \(3\) tanesi tek renklidir; kalan \(12\) tanesi iki farklı renk içerir. Dolayısıyla

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

Kod Nasıl Çalışır

C++, Python ve Java uygulamaları aynı formülü kullanır. Önce toplam top sayısı \(CB\) ve bir sabit rengin dışarıda bırakılmasıyla kalan top sayısı \((C-1)B\) hesaplanır.

Daha sonra

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

çarpımı terim terim oluşturulur. Döngünün her adımı, sabit rengin hiç görünmeme olasılığına bir çarpan ekler.

Son aşamada bu olasılığın tümleyeni alınır ve \(C\) ile çarpılır:

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

Sonuç dokuz ondalık basamakla yazdırılır. C++ uygulaması ayrıca küçük bir oyuncak örnek ve \(D=0\) sınır durumu üzerinde kısa doğrulamalar yapar.

Karmaşıklık Analizi

Genel parametreler için yöntem tam olarak \(D\) adet çarpımsal güncelleme yapar. Bu nedenle çalışma süresi \(O(D)\), ek bellek kullanımı ise \(O(1)\)'dir. Gerçek problemde \(D=20\) olduğundan hesap son derece küçüktür. Asıl kazanım, örnekleri tek tek saymaya veya büyük kombinasyon tabloları oluşturmaya hiç ihtiyaç kalmamasıdır.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: https://projecteuler.net/problem=493
  2. Hipergeometrik dağılım: Wikipedia — Hipergeometrik dağılım
  3. Gösterge fonksiyonu ve gösterge değişkenleri: Wikipedia — Gösterge fonksiyonu
  4. Beklenen değer ve lineerlik: Wikipedia — Beklenen değer
  5. Binom katsayısı: Wikipedia — Binom katsayısı

Resumen del Problema

Una urna contiene \(C\) colores y cada color aparece exactamente \(B\) veces, de modo que hay \(CB\) bolas en total. Se extraen \(D\) bolas uniformemente y sin reemplazo, y se pide la esperanza del número de colores distintos observados en la muestra. En el caso de Problem 493, \((C,B,D)=(7,10,20)\).

Enfoque Matemático

Sea \(X\) el número de colores distintos vistos en la extracción. La idea central es escribir \(X\) como suma de variables indicadoras y reducir todo a la probabilidad de que un color fijo aparezca al menos una vez. Esa probabilidad se obtiene cómodamente mediante un evento complementario hipergeométrico.

Paso 1: Modelar la Variable Aleatoria

Para cada color \(j\in\{1,\dots,C\}\), definimos una variable indicadora \(I_j\) que vale \(1\) si el color \(j\) aparece al menos una vez y \(0\) en caso contrario. Entonces

$$X=\sum_{j=1}^{C} I_j.$$

De esta forma, una pregunta global sobre cuántos colores aparecen se convierte en una suma de eventos elementales de sí o no.

Paso 2: Aplicar la Linealidad de la Esperanza

Al tomar esperanza obtenemos

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

No hace falta independencia entre los indicadores; la linealidad siempre es válida. Como todas las clases de color son simétricas, todas tienen la misma probabilidad de aparecer. Si definimos

$$p=\Pr(I_1=1),$$

entonces

$$\mathbb{E}[X]=Cp.$$

Por tanto, el problema completo se reduce a calcular la probabilidad de aparición de un solo color fijo.

Paso 3: Contar el Evento Complementario

Es más fácil calcular la probabilidad contraria, es decir, que ese color fijo no aparezca. El número total de muestras de tamaño \(D\) es

$$\binom{CB}{D}.$$

Si un color concreto falta por completo, entonces las \(D\) bolas extraídas deben proceder de los otros \(C-1\) colores, que en conjunto aportan \((C-1)B\) bolas. Por ello

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Como \(p=1-q\), resulta

$$p=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Paso 4: Obtener la Fórmula Cerrada

Sustituyendo en \(\mathbb{E}[X]=Cp\) se llega a

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

Para los valores del problema de Euler, esto se convierte en

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

Esta ya es la respuesta matemática exacta; luego solo queda evaluarla numéricamente de manera estable.

Paso 5: Reescribir la Razón Combinatoria como un Producto

No hace falta calcular por separado dos coeficientes binomiales enormes. Usando el producto descendente,

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!},$$

se obtiene para \(A\le N\)

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

Tomando \(A=(C-1)B\) y \(N=CB\), la probabilidad de ausencia es

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

Esta es exactamente la forma usada por la implementación, porque evita valores intermedios gigantes y encaja bien con aritmética de punto flotante.

Ejemplo Desarrollado: \((C,B,D)=(3,2,2)\)

Este caso pequeño puede verificarse a mano. Hay \(3\) colores con \(2\) bolas cada uno, así que el total es \(6\). Para un color fijo, la probabilidad de que falte en dos extracciones es

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

Entonces

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

La enumeración directa confirma el mismo resultado. Entre las \(\binom{6}{2}=15\) parejas posibles, exactamente \(3\) son monocromáticas y las otras \(12\) contienen dos colores distintos, de modo que

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

Cómo Funciona el Código

Las implementaciones en C++, Python y Java siguen exactamente la misma fórmula. Primero calculan el total de bolas \(CB\) y el número de bolas disponibles cuando se excluye un color fijo, es decir, \((C-1)B\).

Después evalúan término a término el producto

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

Cada iteración del bucle añade un factor a la probabilidad de que el color elegido no aparezca.

Al final, toman el complemento y multiplican por \(C\):

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

El resultado se imprime con nueve cifras decimales. La implementación en C++ además comprueba un caso pequeño verificable a mano y el caso límite \(D=0\) antes de producir la salida final.

Análisis de Complejidad

Para parámetros generales, el método realiza exactamente \(D\) actualizaciones multiplicativas, así que el tiempo es \(O(D)\) y la memoria adicional es \(O(1)\). En la instancia de Euler, \(D=20\), por lo que el coste numérico es minúsculo. La ganancia real es evitar por completo la enumeración de muestras y la construcción de tablas combinatorias grandes.

Notas y Referencias

  1. Página del problema: https://projecteuler.net/problem=493
  2. Distribución hipergeométrica: Wikipedia — Distribución hipergeométrica
  3. Función indicadora y variables indicadoras: Wikipedia — Función indicadora
  4. Esperanza matemática y linealidad: Wikipedia — Valor esperado
  5. Coeficiente binomial: Wikipedia — Coeficiente binomial

问题概述

一个袋子里有 \(C\) 种颜色,每种颜色恰好有 \(B\) 个球,因此总球数是 \(CB\)。现在从中等概率且不放回地抽取 \(D\) 个球,要求样本中“出现过的不同颜色数”的期望值。对于 Problem 493,参数是 \((C,B,D)=(7,10,20)\)。

数学方法

记 \(X\) 为抽样后看到的不同颜色数量。这个问题最简洁的做法不是直接对颜色子集做容斥,而是把 \(X\) 写成若干指示变量之和,再把期望化简成“某个固定颜色至少出现一次”的概率。这个概率又可以通过一个很简单的补事件来得到。

步骤 1:建立随机变量

对每一种颜色 \(j\in\{1,\dots,C\}\),定义指示变量 \(I_j\)。如果颜色 \(j\) 在抽出的 \(D\) 个球中至少出现一次,则 \(I_j=1\);如果一次都没有出现,则 \(I_j=0\)。于是不同颜色的总数就是

$$X=\sum_{j=1}^{C} I_j.$$

这样一来,原来“统计出现了多少种颜色”的整体问题,就被拆成了每种颜色各自对应的一个二值事件。

步骤 2:利用期望的线性性

对上式取期望,可以得到

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

这里不需要各个 \(I_j\) 彼此独立,因为期望的线性性在任何情况下都成立。又由于每种颜色在题目中的地位完全对称,所以它们出现的概率都相同。设

$$p=\Pr(I_1=1),$$

那么立刻有

$$\mathbb{E}[X]=Cp.$$

因此,整个问题被压缩成一个单独的概率计算:固定某一种颜色,它至少出现一次的概率是多少。

步骤 3:计算补事件概率

直接算“出现”的概率不如先算“完全没有出现”的概率更方便。总共有

$$\binom{CB}{D}$$

种等可能的 \(D\) 球样本。如果某一种固定颜色完全缺席,那么这 \(D\) 个球只能从其余 \(C-1\) 种颜色中选出,而这些颜色一共提供了 \((C-1)B\) 个球。因此

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

于是

$$p=1-q=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

这个比值本质上就是一个超几何分布中的“某一类完全没被抽到”的概率。

步骤 4:得到封闭公式

把上式代回 \(\mathbb{E}[X]=Cp\),就得到最终的精确表达式

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

对本题的参数 \((C,B,D)=(7,10,20)\),公式就是

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

也就是说,数学上已经完全解决了问题;剩下的只是如何把这个表达式稳定地算成小数结果。

步骤 5:把组合数比值改写成乘积

如果直接分别计算 \(\binom{60}{20}\) 和 \(\binom{70}{20}\),中间量会非常大。更好的做法是利用下降乘积形式

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!}.$$

因此,对任意 \(A\le N\) 都有

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

取 \(A=(C-1)B\)、\(N=CB\),就得到

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

这正是实现里采用的数值形式。它不需要构造巨大的阶乘或组合数,中间值始终保持在普通浮点范围内,因此更稳定也更直接。

演算示例:\((C,B,D)=(3,2,2)\)

这个小例子可以完全手算验证。共有 \(3\) 种颜色、每种 \(2\) 个球,所以总数是 \(6\)。对某一种固定颜色来说,两次抽取中一次都没有抽到它的概率为

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

因此

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

直接枚举也会得到同样的结果。因为 \(\binom{6}{2}=15\) 个等可能的二球样本中,恰好有 \(3\) 个是同色对,其余 \(12\) 个都包含两种不同颜色,所以

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

代码如何工作

C++、Python 和 Java 实现使用的是同一条公式。它们先计算总球数 \(CB\),以及去掉一个固定颜色后剩余的球数 \((C-1)B\)。

随后逐项累乘

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

这个乘积。循环中的每一步都对应“固定颜色仍然没有被抽到”的一个比值因子。

乘积结束后,再取补概率并乘上颜色总数 \(C\):

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

最后把结果输出为保留九位小数的十进制数。C++ 版本还会先检查一个可以手算的小例子,以及 \(D=0\) 的边界情形,确认公式实现没有偏差。

复杂度分析

对一般参数来说,算法只需要做 \(D\) 次乘法更新,因此时间复杂度是 \(O(D)\),额外空间复杂度是 \(O(1)\)。在本题里 \(D=20\),所以计算量极小。真正重要的是,这个方法完全不需要枚举抽样结果,也不需要建立任何大型组合表。

注释与参考资料

  1. 题目页面:https://projecteuler.net/problem=493
  2. 超几何分布:Wikipedia — 超几何分布
  3. 指示函数与指示变量:Wikipedia — 指示函数
  4. 期望值与线性性:Wikipedia — 期望值
  5. 二项式系数:Wikipedia — 二项式系数

Краткое описание задачи

В урне есть \(C\) цветов, причём шаров каждого цвета ровно \(B\), так что всего шаров \(CB\). Из урны равновероятно и без возвращения извлекают \(D\) шаров. Требуется найти математическое ожидание числа различных цветов, попавших в выборку. В задаче Problem 493 используются параметры \((C,B,D)=(7,10,20)\).

Математический подход

Обозначим через \(X\) количество различных цветов, увиденных после извлечения. Ключевая идея состоит в том, чтобы представить \(X\) как сумму индикаторов и свести задачу к одной вероятности для фиксированного цвета. Эта вероятность удобно находится через дополнительное событие гипергеометрического типа.

Шаг 1: Построить случайную величину

Для каждого цвета \(j\in\{1,\dots,C\}\) введём индикатор \(I_j\), равный \(1\), если цвет \(j\) встретился хотя бы один раз, и равный \(0\), если он не встретился ни разу. Тогда число различных цветов равно

$$X=\sum_{j=1}^{C} I_j.$$

Так исходная задача о количестве разных цветов превращается в сумму простых двоичных событий, по одному на каждый цвет.

Шаг 2: Использовать линейность матожидания

Берём ожидание и получаем

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

Независимость индикаторов не требуется: линейность матожидания верна всегда. По симметрии все цвета имеют одинаковую вероятность появиться. Если обозначить

$$p=\Pr(I_1=1),$$

то сразу следует

$$\mathbb{E}[X]=Cp.$$

Значит, вся задача сведена к вычислению вероятности появления одного фиксированного цвета.

Шаг 3: Посчитать дополнительное событие

Напрямую считать вероятность появления неудобно; проще сначала найти вероятность отсутствия выбранного цвета. Общее число равновероятных выборок размера \(D\) равно

$$\binom{CB}{D}.$$

Если фиксированный цвет вовсе не встретился, то все \(D\) шаров должны быть выбраны из оставшихся \(C-1\) цветов, то есть из \((C-1)B\) шаров. Поэтому

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Отсюда

$$p=1-q=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

Шаг 4: Получить замкнутую формулу

Подставляя это в \(\mathbb{E}[X]=Cp\), получаем точную формулу

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

Для параметров задачи Euler это принимает вид

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

С математической точки зрения задача на этом уже решена; остаётся лишь аккуратно вычислить выражение численно.

Шаг 5: Переписать отношение сочетаний в виде произведения

Вычислять два огромных биномиальных коэффициента по отдельности не нужно. Используем представление через нисходящее произведение:

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!}.$$

Тогда для \(A\le N\) имеем

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

Подставляя \(A=(C-1)B\) и \(N=CB\), получаем

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

Именно эту форму используют реализации, потому что она избавляет от гигантских промежуточных значений и естественно вычисляется в вещественной арифметике.

Разобранный пример: \((C,B,D)=(3,2,2)\)

Этот маленький пример легко проверить вручную. Имеются \(3\) цвета по \(2\) шара каждого, то есть всего \(6\) шаров. Для одного фиксированного цвета вероятность его отсутствия в двух извлечениях равна

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

Следовательно,

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

Прямая проверка даёт тот же ответ. Среди \(\binom{6}{2}=15\) равновероятных пар ровно \(3\) пары одноцветные, а остальные \(12\) содержат два разных цвета, так что

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

Как работает код

Реализации на C++, Python и Java следуют одной и той же формуле. Сначала они вычисляют общее число шаров \(CB\) и количество шаров \((C-1)B\), которое остаётся после исключения одного фиксированного цвета.

Затем поэлементно накапливают произведение

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

Каждая итерация цикла добавляет один множитель к вероятности того, что выбранный цвет не встретился вовсе.

После этого берётся дополнение и результат умножается на \(C\):

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

Далее число выводится с точностью до девяти знаков после запятой. В реализации на C++ дополнительно выполняются маленькие проверки: игрушечный пример и граничный случай \(D=0\).

Анализ сложности

Для общих параметров алгоритм делает ровно \(D\) мультипликативных обновлений, поэтому его время работы равно \(O(D)\), а дополнительная память равна \(O(1)\). В самой задаче \(D=20\), так что вычисление чрезвычайно маленькое. Главный выигрыш в том, что здесь нет перебора выборок и нет построения больших таблиц сочетаний.

Примечания и ссылки

  1. Страница задачи: https://projecteuler.net/problem=493
  2. Гипергеометрическое распределение: Wikipedia — Гипергеометрическое распределение
  3. Индикаторная функция и индикаторные переменные: Wikipedia — Индикаторная функция
  4. Математическое ожидание и линейность: Wikipedia — Математическое ожидание
  5. Биномиальный коэффициент: Wikipedia — Биномиальный коэффициент

ملخص المسألة

لدينا وعاء يحتوي على \(C\) ألوان، ولكل لون \(B\) كرات، ولذلك يكون العدد الكلي للكرات هو \(CB\). نسحب \(D\) كرات عشوائياً وبدون إرجاع، والمطلوب هو القيمة المتوقعة لعدد الألوان المختلفة التي تظهر في العينة. في Problem 493 تكون القيم \((C,B,D)=(7,10,20)\).

المنهج الرياضي

لنرمز إلى عدد الألوان المختلفة التي ظهرت بعد السحب بالمتغير \(X\). الفكرة الأساسية هي كتابة \(X\) كمجموع لمتغيرات مؤشرية، ثم اختزال المسألة كلها إلى احتمال ظهور لون ثابت مرة واحدة على الأقل. هذا الاحتمال يُحسب بسهولة عبر الحدث المتمم ذي الطبيعة فوق الهندسية.

الخطوة 1: توصيف المتغير العشوائي

لكل لون \(j\in\{1,\dots,C\}\)، نعرّف متغيراً مؤشرياً \(I_j\) يساوي \(1\) إذا ظهر اللون \(j\) مرة واحدة على الأقل في السحوبات، ويساوي \(0\) إذا لم يظهر أبداً. عندئذٍ يكون عدد الألوان المختلفة

$$X=\sum_{j=1}^{C} I_j.$$

وبهذا تتحول المسألة من سؤال شامل عن عدد الألوان إلى مجموع أحداث ثنائية بسيطة، حدث واحد لكل لون.

الخطوة 2: استخدام خطية التوقع

بأخذ التوقع نحصل على

$$\mathbb{E}[X]=\sum_{j=1}^{C}\mathbb{E}[I_j]=\sum_{j=1}^{C}\Pr(I_j=1).$$

لا نحتاج هنا إلى استقلالية هذه المتغيرات، لأن خطية التوقع صحيحة دائماً. وبسبب التماثل، فاحتمال ظهور أي لون هو نفسه لأي لون آخر. إذا كتبنا

$$p=\Pr(I_1=1),$$

فإننا نحصل مباشرة على

$$\mathbb{E}[X]=Cp.$$

إذن انخفضت المسألة كلها إلى حساب احتمال ظهور لون واحد محدد.

الخطوة 3: حساب الحدث المتمم

الأسهل هو حساب احتمال عدم ظهور هذا اللون المحدد إطلاقاً. عدد العينات الممكنة ذات الحجم \(D\) هو

$$\binom{CB}{D}.$$

وإذا غاب لون ثابت تماماً، فهذا يعني أن جميع الكرات المسحوبة جاءت من الألوان الأخرى وعددها \(C-1\)، أي من بين \((C-1)B\) كرة. لذلك

$$q=\Pr(I_1=0)=\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

ومن ثم

$$p=1-q=1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}.$$

الخطوة 4: الحصول على الصيغة المغلقة

بالتعويض في العلاقة \(\mathbb{E}[X]=Cp\) نحصل على الصيغة الدقيقة

$$\boxed{\mathbb{E}[X]=C\left(1-\frac{\binom{(C-1)B}{D}}{\binom{CB}{D}}\right).}$$

وبالنسبة لقيم مسألة أويلر تصبح

$$\mathbb{E}[X]=7\left(1-\frac{\binom{60}{20}}{\binom{70}{20}}\right).$$

وهذا ينجز الحل الرياضي بالكامل؛ وما يبقى بعد ذلك هو تقييم هذه الصيغة عددياً بطريقة مستقرة.

الخطوة 5: تحويل نسبة التوافيق إلى جداء

ليس من الضروري حساب معاملي ثنائي الحد الكبيرين كلٌّ على حدة. باستخدام صيغة الجداء التنازلي

$$\binom{n}{D}=\frac{n(n-1)\cdots(n-D+1)}{D!}$$

نحصل، لأي \(A\le N\)، على

$$\frac{\binom{A}{D}}{\binom{N}{D}}=\frac{A(A-1)\cdots(A-D+1)}{N(N-1)\cdots(N-D+1)}=\prod_{i=0}^{D-1}\frac{A-i}{N-i}.$$

وباختيار \(A=(C-1)B\) و\(N=CB\) نحصل على

$$q=\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}.$$

وهذه هي الصيغة التي تعتمدها التطبيقات فعلاً، لأنها تتجنب القيم الوسيطة الضخمة وتنسجم مباشرة مع الحسابات العائمة.

مثال محلول: \((C,B,D)=(3,2,2)\)

هذا المثال الصغير يمكن التحقق منه يدوياً. لدينا \(3\) ألوان، ولكل لون \(2\) كرة، أي إن العدد الكلي \(6\). احتمال غياب لون ثابت تماماً في سحبتين يساوي

$$q=\frac{\binom{4}{2}}{\binom{6}{2}}=\frac{6}{15}=\frac{2}{5}.$$

ومن ثم

$$p=1-q=\frac{3}{5},\qquad \mathbb{E}[X]=3\cdot\frac{3}{5}=\frac{9}{5}=1.8.$$

والعد المباشر يؤكد النتيجة نفسها. فمن بين \(\binom{6}{2}=15\) زوجاً محتملاً، يوجد بالضبط \(3\) أزواج أحادية اللون و\(12\) زوجاً يحتوي كل منها على لونين مختلفين، ولذلك

$$\frac{3\cdot 1+12\cdot 2}{15}=\frac{27}{15}=\frac{9}{5}.$$

كيف تعمل الشيفرة

تستخدم تطبيقات C++ وPython وJava الصيغة نفسها تماماً. فهي تبدأ بحساب العدد الكلي للكرات \(CB\)، ثم تحسب عدد الكرات المتبقية بعد استبعاد لون ثابت واحد، أي \((C-1)B\).

بعد ذلك تُقيَّم قيمة الجداء

$$\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}$$

حداً بعد حد. كل دورة في الحلقة تضيف عاملاً واحداً إلى احتمال غياب اللون المختار من العينة.

ثم يؤخذ المتمم ويُضرب الناتج في \(C\):

$$C\left(1-\prod_{i=0}^{D-1}\frac{(C-1)B-i}{CB-i}\right).$$

وأخيراً يُطبع الناتج مع تسعة أرقام بعد الفاصلة العشرية. كما أن تنفيذ C++ يجري فحوصات صغيرة إضافية، منها المثال اليدوي أعلاه وحالة الحافة \(D=0\)، قبل طباعة النتيجة النهائية.

تحليل التعقيد

بالنسبة للمعاملات العامة، تنفذ الطريقة بالضبط \(D\) تحديثات ضرب، ولذلك يكون الزمن \(O(D)\) والذاكرة الإضافية \(O(1)\). وفي المسألة الفعلية لدينا \(D=20\)، لذا فالحمل العددي صغير جداً. الفائدة الجوهرية أن الخوارزمية لا تعدّ العينات واحدة واحدة ولا تبني أي جداول توافقية كبيرة.

هوامش ومراجع

  1. صفحة المسألة: https://projecteuler.net/problem=493
  2. التوزيع فوق الهندسي: Wikipedia — التوزيع فوق الهندسي
  3. الدالة المؤشرية والمتغيرات المؤشرية: Wikipedia — دالة مؤشرة
  4. القيمة المتوقعة وخطيتها: Wikipedia — قيمة متوقعة
  5. المعامل الثنائي: Wikipedia — معامل ثنائي