воскресенье, 22 июля 2012 г.

Выбрать 6 карт из колоды

Есть полная колода из 52-х карт, без джокеров. Сколькими способами можно выбрать из этой колоды 6 карт так, чтобы в этом наборе были представлены все 4 масти?

Решение
Понятно, что раз карт 6, а мастей 4, то какие-то масти обязательно будут повторяться. Возможны два варианта: либо какая-то масть будет встречаться 3 раза (т.е. 3-1-1-1), либо две масти будут повторяться по два раза (т.е. 2-2-1-1), и других вариантов нет. Это позволяет нам посчитать по отдельности эти два класса.

Сначала рассмотрим вариант с 3 картами одной масти. Сначала мы выбираем "длинную" масть, для этого у нас есть $C^1_4$ варианта. После этого нам нужно выбрать любые 3 карты этой масти, что можно сделать $C^3_{13}$ способами. Наконец, из каждой из оставшихся трёх мастей мы выбираем по одной карте, т.е. трижды по $C^1_{13}$. Общее число способов составить набор вида 3-1-1-1, таким образом, равно$$
P_1 = C^1_4 \cdot C^3_{13} \cdot \left(C^1_{13}\right)^3
= 4 \cdot \frac{13!}{3!10!} \cdot 13^3
= 4 \cdot \frac{10!\cdot11\cdot12\cdot13}{6\cdot10!}\cdot 13^3
= 88\cdot13^4
$$Теперь посчитаем варианты во втором классе. Сначала мы выбираем те две масти, в которых будет по две карты (это $C^2_4$ способа). После этого мы выбираем по две карты из каждой из них (дважды по $C^2_{13}$) и по одной из оставшихся (два раза по $C^1_{13}$).$$
P_2 = C^2_4 \cdot \left(C^2_{13}\right)^2 \cdot \left(C^1_{13}\right)^2
=6 \cdot \left( \frac{13!}{2!11!} \right)^2 \cdot 13^2=$$ $$
=6 \cdot \left( \frac{11!\cdot12\cdot13}{2\cdot11!}\right)^2 \cdot 13^2
=6^3 \cdot 13^4 = 216\cdot13^4
$$
Как мы уже заметили, эти два класса не пересекаются, поэтому количество всех способов выбрать 6 карт, задействовав все 4 масти, равно$$
P = P_1 + P_2 = 88\cdot13^4 + 216\cdot13^4 = 304\cdot13^4 = 8682544$$

1 комментарий:

  1. Я считал по-другому, но ответ такой же. Вот мое решение:

    # Факториал.
    def fac(n):
    res = 1
    for i in xrange(2, n + 1):
    res = res * i
    return res

    # C из n по k.
    def c(n, k):
    return fac(n) / fac(k) / fac(n - k)

    # Сколькими способами можно выбрать 6 карт одной масти из
    # колоды, в которой m мастей (13 карт каждой масти).
    def v1(m):
    return m * c(13, 6)

    # Сколькими способами можно выбрать 6 карт двух мастей из
    # колоды, в которой m мастей.
    def v2(m):
    return c(m, 2) * (c(26, 6) - v1(2))

    # Сколькими способами можно выбрать 6 карт трех мастей из
    # колоды, в которой m мастей.
    def v3(m):
    return c(m, 3) * (c(39, 6) - v2(3) - v1(3))

    # Сколько всего способов выбрать 6 кари из полной колоды.
    total = c(52, 6)

    # Сколькими способами можно выбрать 6 карт четырех мастей из
    # полной колоды.
    result = total - v3(4) - v2(4) - v1(4)

    Еще я перебором проверил, что ответ правильный. Программка на C++:

    #define FOR(i, n) for (int i = 0; i != n; ++i)

    int s(int c) {
    return 1 << (c / 13);
    }

    int main() {
    int res = 0;
    FOR(i1, 52) FOR(i2, i1) FOR(i3, i2) FOR(i4, i3) FOR(i5, i4) FOR(i6, i5) {
    if ((s(i1) | s(i2) | s(i3) | s(i4) | s(i5) | s(i6)) == 15)
    ++res;
    }
    std::cout << res << std::endl;
    }

    ОтветитьУдалить