11550. x1 + x2 + … + xk = n
По заданным значениям k и n найдите количество натуральных решений уравнения
x1 + x2 + ...+ xk = n
Вход. Два натуральных числа
k и n (k ≤ n ≤ 100).
Выход. Выведите количество натуральных решений для заданного
уравнения. Известно, что ответ не превышает
1018.
Пример
входа |
Пример
выхода |
3 4 |
3 |
комбинаторика
Рассмотрим
последовательность из n единиц: 111…11. Между любыми двумя единицами можно вставить знак ‘+’. Например 11+111+1. Такая запись
будет обозначать сумму 2 + 3 + 1, где каждое слагаемое – количество единиц,
стоящих рядом. Количество позиций, куда можно
вставить знак ‘+’, равно n – 1. Поскольку необходимо получить сумму из k
слагаемых, то следует вставить k – 1 знак ‘+’.
Нам следует вставить k – 1
плюс на n – 1 место. Это можно сделать способами.
Пример
Рассмотрим
уравнение x1 + x2 + x3 = 4. Оно
имеет 3 положительных целочисленных решения: (1, 1, 2), (1, 2, 1), (2, 1, 1).
Например, n = 4 единицы на k
= 3 слагаемых можно
разбить = 3 способами:
Реализация алгоритма
Функция 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 - 1);
printf("%lld\n", res);
import math
Читаем входные
данные.
k, n = map(int,input().split())
Вычисляем и
выводим ответ .
res = math.comb(n - 1, k - 1)
print(res)