Stars and bars: сколько неотрицательных решений у x1+x2+...+xk = n?
В задаче надо посчитать, сколькими способами разложить n одинаковых предметов по k различным ящикам (ящики могут быть пустыми). Это же уравнение x1+...+xk = n в неотрицательных целых. Какая тут формула и как её обосновать? И что меняется, если каждый ящик должен быть непустым?
2 ответа
Это «звёзды и палочки» (stars and bars). Представь n звёздочек в ряд и (k−1) палочек-перегородок, которые делят их на k групп. Любая расстановка перегородок ↔ одно решение. Всего объектов n + (k−1), выбираем, где стоят k−1 палочек:
Число неотрицательных решений = C(n + k − 1, k − 1) = C(n + k − 1, n).
Если каждый x_i ≥ 1 (ящики непусты), подставь x_i = y_i + 1, y_i ≥ 0: уравнение становится y_1+...+y_k = n − k, откуда ответ = C(n − 1, k − 1) (при n ≥ k, иначе 0).
// неотрицательные решения x1+...+xk = n
long long starsBars(int n, int k) { // C(n+k-1, k-1)
return C(n + k - 1, k - 1); // C — через факториалы mod p
}
// положительные решения
long long starsBarsPositive(int n, int k) {
if (n < k) return 0;
return C(n - 1, k - 1);
}
Сложность — O(1) после предподсчёта факториалов. Обобщения с верхними границами на x_i решаются добавлением включения-исключения по «превышениям».
Частая ошибка — путать различимые предметы с одинаковыми. Stars and bars — про ОДИНАКОВЫЕ предметы в РАЗЛИЧНЫЕ ящики. Если предметы различимы, ответ — k^n (каждый предмет независимо в любой из k ящиков). А если и предметы, и ящики одинаковы, это уже разбиения числа n на ≤ k частей — там простой формулы нет, считают ДП.