Имею список цифр, к примеру 0, 0, 1, 1, 2, 3, 4, 4.
Задача - установить, сколько из них можно составить чисел (не начинающихся с нуля). Все цифры должны быть использованы.
Логика:
1. Пусть
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
- длина списка. Тогда, без учета того, что число не может начинаться с нуля, можно использовать формулу:
![$\dfrac{n!}{m_0!m_1!\dots m_9!}$ $\dfrac{n!}{m_0!m_1!\dots m_9!}$](https://dxdy-01.korotkov.co.uk/f/0/a/3/0a382d11f40864ad083fdd42099fe75e82.png)
где
![$m_i$ $m_i$](https://dxdy-01.korotkov.co.uk/f/4/7/b/47b592a798cd56ccf668b67abad36a6182.png)
- кол-во вхождений цифры
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
в список.
2. Если в списке нет нулей, ответ получен. Если в списке есть нули,
из результата п. 1 вычесть значение выражения из п. 1, но для списка без одного из нулей. Например, список 0, 0, 1, 1, 2, 3, 4, 4 превращается в список 0, 1, 1, 2, 3, 4, 4.
Для данного примера:
![$\dfrac{8!}{2!2!1!1!2!0!0!0!0!0!}-\dfrac{7!}{1!2!1!1!2!0!0!0!0!0!}=3780$ $\dfrac{8!}{2!2!1!1!2!0!0!0!0!0!}-\dfrac{7!}{1!2!1!1!2!0!0!0!0!0!}=3780$](https://dxdy-03.korotkov.co.uk/f/e/f/a/efaecfdd76948e68afb080933ac5971d82.png)
Сюда же прилагаю свой корявенький код на Python, работающий перебором. Ответ также 3780.
Код:
from itertools import permutations
input_list = [0, 0, 1, 1, 2, 3, 4, 4]
def l2n(l):
return int("".join(map(str, l)))
all_permutations = set(filter(lambda x: x >= 10 ** 7, map(l2n, permutations(input_list, 8))))
print(len(all_permutations))
Спасибо