1.4 K-сочетания из n-элементов

Основы перечислительной комбиаторики

1.4 K-сочетания из n-элементов

модуль 1.4 шаг 3


В магазине продаются открытки 10 видов. Сколькими способами можно купить в нем восемь различных открыток?

Решение

1
2
3
4
5
6
7
8
9
def soch(n, k):
    if n == k:
        return 1
    if k == 1:
        return n
  
    return soch(n-1, k-1) + soch(n-1, k)
 
print(soch(10, 8))

или

мошность (по k из n) =мошность ( по (n-k) из n )

=> (по 8 из 10) = ( по 2 из 10 )

=> ( по 2 из 10 ) = (по 1 из 9 ) + (по 2 из 9) => 9 + (по 2 из 9) => 9 + (9!/ 7!*2!) или продолжаем пока k != n

=> (по 1 из 9 ) + (по 1 из 8) + (по 1 из 7 ) + (по 1 из 6 ) + (по 1 из 5 ) + (по 1 из 4 ) + (по 1 из 3 ) + (по 1 из 2 ) + (по 1 из 1 )

=> 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 +1 = 45

Ответ

45

модуль 1.4 шаг 4


Сколькими способами можно расставить 15 одинаковых шашек на доске размерами 9×9?

Решение

1
2
3
4
5
6
7
8
def fact(n):
    if n==0:
        return 1
    return fact(n-1)*n
print(fact(0))
def choose(n,k):
    return fact(n)/(fact(k)*fact(n-k))
print(choose(81,15))

Ответ

8144022047817960

модуль 1.4 шаг 5


Нужно сгенерировать все возможные k-сочетания из n элементов.

Формат входных данных: Два числа k и n через пробел. Для них гарантированно выполняется условие: \(0\leqslant{ k}\leqslant{n}\).

Формат выходных данных: Необходимое число строк, в каждой из которых содержится k чисел из диапазона от 0 до n-1 включительно, разделенных пробелом.

Sample Input 1:

1
2 3

Sample Output 1:

1
2
3
0 1
0 2
1 2

Sample Input 2:

1
1 1

Sample Output 2:

1
0

Решение

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from itertools import *
input_text = input().split()
k = int(input_text[0])
n = int(input_text[1])
if n>=k:
    if k==1 and n==1:
        print(0)
    else:
        se = list()
        for t in range(0, n):
            se.append(t)
 
        res = list(combinations(se, k))

        for i in range(0, len(res)):
            rr = list(res[i])
  
            print(*rr, sep=' ')

1
2
3
k, n = STDIN.readline.split.map(&:to_i)
result = (0..n-1).to_a.combination(k).to_a
result.each { |line| puts line.join(' ') }

Ответ

программа python

модуль 1.4 шаг 11


Предлагаем вам самим поупражняться в комбинаторных доказательствах.

Докажите комбинаторно тождество Вандермонда:

\[\binom{n+m}{k}=\sum\limits_{i=0}^{k}\binom{n}{i}\cdot\binom{m}{k-i}.\]

Решение

Ответ

модуль 1.4 шаг 14


В магазине продаются открытки 10 видов. Сколькими способами можно купить в нем 8 открыток?

Решение

1
2
3
4
5
6
7
8
9
def soch(n, k):
    if n == k:
        return 1
    if k == 1:
        return n
  
    return soch(n-1, k-1) + soch(n-1, k)
 
print(soch(10+8-1, 8))

Ответ 24310

модуль 1.4 шаг 15


Сколько существует шестизначных чисел, сумма цифр которых не превосходит 47?

Решение

1
2
3
4
5
6
7
8
9
10
11
12
a=[]
b=0
c=0
for i in range(100000, 1000000):
    a+=str(i)
    for j in range(len(a)):
        b+=int(a[j])
    if(b<=47):
        c+=1
    b=0
    a=[]
print(c)

Ответ

899076

модуль 1.4 шаг 16


Сколько существует бинарных (т.е. состоящих из цифр 0 и 1 ) строк длины n, содержащих k единиц, в которых никакие две единицы не стоят рядом?

Решите задачу в общем случае, а в качестве ответа введите количество таких строк для n = 42 и k = 7.Сколько существует шестизначных чисел, сумма цифр которых не превосходит 47?

Решение

1 решение.

Так как между единицами должен быть ноль, то можно рассматривать слова в алфавите {‘10’, ‘0’}. Эти слова только один случай не рассматривают: когда слово кончается на единицу; рассмотрим его отдельно.

Пусть \(x\) — количество нулей в слове. У нас слово длины nn, а ‘10’ занимает два места.

Получается \(2k+x=>x=n-2k\)

Получается длина в новом алфавите будет \(k+n-2k=n-k\).

Посчитаем количество слов такой длины \(C_{n-k}^k\).

Посчитаем количество слов, когда в конце стоит ‘1’. Т.е мы будет рассматривать слова, где нулей столько же, но букв ‘10’ на одну меньше

Получается \(2k-2+x=n-1=>x=n+1-2k\)

Длина \((k-1)+(n+1-2k)=n-k\).

Посчитаем количество слов длины такой \(C_{n-k}^{k-1}\)

Суммарно \(C_{n-k}^k+C_{n-k}^{k-1}=C_{n-k+1}^{k}\).

\(C_{42-7+1}^{7}=8347680\).

2 решение.

Возьмём все единцы и расставим между ними нули. Всего единиц k, значит, чтобы расставить между ними нули, нужно k-1 ноль.

Остаёться n-(k-1) неиспользованных нулей.

Их можно положить между единицами, причём ещё в начало и конец. Т.е k+1 место. Причём в одно место можно положить несколько нулей

\[\bar{C}_{k+1}^{2k+1}=C_{k+1+n-2k+1-1}^{n-2k+1}=C_{n-k+1}^{n-k+1-(n-2k+1)}=C_{n-k+1}^{k}\]

Ответ

8347680