Имею список цифр, к примеру 0, 0, 1, 1, 2, 3, 4, 4.
Задача - установить, сколько из них можно составить чисел (не начинающихся с нуля). Все цифры должны быть использованы.
Логика:
1. Пусть
- длина списка. Тогда, без учета того, что число не может начинаться с нуля, можно использовать формулу:
где
- кол-во вхождений цифры
в список.
2. Если в списке нет нулей, ответ получен. Если в списке есть нули,
из результата п. 1 вычесть значение выражения из п. 1, но для списка без одного из нулей. Например, список 0, 0, 1, 1, 2, 3, 4, 4 превращается в список 0, 1, 1, 2, 3, 4, 4.
Для данного примера:
Сюда же прилагаю свой корявенький код на 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))
Спасибо