Как-то раз, придя домой со школы, Света обнаружила записку от матери,

Как-то раз, придя домой со школы, Света нашла записку от матери, в которой она просила сделать салат. Света знала, что салат это смесь 2-ух либо более ингредиентов, поэтому ей не составило труда выполнить мамину просьбу.

Но Света желает стать математиком, потому, для тренировки, решила посчитать, сколько различных салатов она сумеет сделать из имеющихся товаров (майонез, огурцы, помидоры). После небольших расчетов она получила ответ: 4.

Зная, что вы любите занимательные задачи, и желаете стать программерами, Света попросила вас написать программку, которая определяет количество разных салатов для случайного числа ингредиентов.Подскажите формулу

Задать свой вопрос
Гена Дененберг
Извините,не могли бы вы написать это на языке программирования C++ либо Pascal?
1 ответ
Количество разных салатов R, которые можно приготовить, имея n продуктов и беря для изготовления k из них (k=2,3,... n-1), в математике определяется, как число размещений из n по k и определяется по последующей формуле:
\displaystyle C_n^k= \fracn!k!(n-k)!
Формула прекрасная, краткая, но неловкая для вычисления. В самом деле, надо отыскать три факториала, каждый из которых может оказаться довольно великим числом. Но можно сделать маленькое преображение и упростить вычисление.
\displaystyle R=C_n^k= \fracn!k!(n-k)! = \frack!(k+1)(k+2)...(n-1)nk!(n-k)!= \\ amp;10; \frac(k+1)(k+2)...(n-1)n1\cdot2\cdot...\cdot(n-k)=\prod_i=1^n-k \frack+ii

Но это было вычисление R только для определенного k при данном n.
Нам же необходимо отыскать сумму R для всех k от 2 до n. И да, для k=n формула не предназначена, но зато мы и так понимаем, что для такого случая R=1.

Задачка свелась к нахождению обыкновенной суммы
\displaystyle S=C_2^n+C_3^n+...+C_n-1^n+1=1+\sum_i=2^n-1C_i^n

// PascalABC.NET 3.2, сборка 1370 от 24.12.2016
// Внимание! Если программка не работает, обновите версию!

function C(n,k:integer):integer;
begin
  if n=k then Result:=1
  else begin
    var p:=1.0;
    for var i:=1 to n-k do p:=p*(k+i)/i;
    Result:=Round(p);
    end;
end;

begin
  var n:=ReadInteger('Кол-во товаров: ');
  var s:=1;
  for var i:=2 to n-1 do s:=s+C(n,i);
  Writeln('Кол-во салатов: ',s)
end.

Образцы:
Кол-во товаров:  3
Кол-во салатов: 4

Кол-во товаров:  5
Кол-во салатов: 26

Кол-во товаров:  10
Кол-во салатов: 1013
, оставишь ответ?
Имя:*
E-Mail:


Последние вопросы

Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт