Чтобы найти количество способов разделения (m+n+p)
элементов в группе m,n,p
, сначала нужно разделить набор на группы m
, а затем каждую из этих групп разделить на n
, а затем разделить на p
.
Теперь способов разделить (m + n + p) элементов на группы (n + p) составляет
==> (n + m + n) C n + p
==> (m + n + p)! / (M! * (N + p)!)
Теперь путейразделить (n + p) элементов на группы по n *
==> (n + p) C n
==>(n + p)! / (n! * (p)!)
, поэтому (n + m + n) C m * (n+ p) C n = (m + n + p)! / (m! * (n + p)!) * (n + p)! / (n! * (p)!)
==> (m + n + p)! / (M! * N! * P!)
Для создания комбинаций мы можем использовать itertools.combination
Учитывая m = 4, n = 3, p = 2
Разделить группу на (n + p) = 5 элементов
>>> g1=(x for x in itertools.combinations(xrange(9),5))
Примечание ::Вы можете оставить это как генератор.
Разделите каждую из этих групп на подгруппы из n элементов = 3 элемента
>>> groups=[(x,tuple(set(g)-set(x))) for g in g1 for x in itertools.combinations(g,3)]
Примечание :: tuple (set (g) -s)et (x)) даст вам элементы, отличные от x, то есть другая часть группы
Размер группы:
>>> len(groups)
1260
>>>
Теперь проверка
>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260