11551. x1 + x2 + … + xk = n
(2)
По заданным значениям k и n
найдите количество неотрицательных
целочисленных решений уравнения
x1 + x2 + ...+ xk = n
Вход. Два натуральных числа
k и n (k ≤ n ≤ 100).
Выход. Выведите количество неотрицательных целочисленных решений для заданного
уравнения. Известно, что ответ не превышает
1018.
Пример
входа |
Пример
выхода |
3 4 |
15 |
комбинаторика
Рассмотрим
последовательность из n + k – 1 позиций. В n позициях
следует поставить 1. В k – 1 позицию следует поставить символ ‘+’ (чтобы получить
k слагаемых).
Любой
расстановке единиц и знаков ‘+’ по позициям будет соответствовать некоторое решение
заданного уравнения. Например, рассмотрим некоторые решения уравнения x1 + x2 + x3 = 4 (4
единицы и 2 плюса):
Нам следует вставить k – 1
плюс на n + k – 1 позиций. Это можно сделать способами.
Пример
Рассмотрим
уравнение x1 + x2 + x3 = 4. Его решениями будут:
·
(4, 0, 0) и ее 3 перестановки
·
(3, 1, 0) и ее 6 перестановок
·
(2, 2, 0) и ее 3 перестановки
·
(2, 1, 1) и ее 3 перестановки
Всего имеется 3 + 6 + 3 + 3 =
15 решений.
Реализация алгоритма
Функция Cnk вычисляет значение биномиального коэффициента .
long long Cnk(long long k, long long n)
{
long long res = 1;
if (k > n - k) k = n - k;
for (long long i = 1; i <= k; i++)
res = res * (n - i + 1) / i;
return res;
}
Основная часть программы. Читаем входные данные.
scanf("%lld %lld", &k, &n);
Вычисляем и выводим ответ .
res = Cnk(k - 1, n +
k - 1);
printf("%lld\n", res);
import math
Читаем входные
данные.
k, n = map(int,input().split())
Вычисляем и
выводим ответ .
res = math.comb(n + k - 1, k - 1)
print(res)