Хочу попередити зразу, що в різних версіях програми алгоритм може дещо відрізнятися.
1. Вибрати в документі МІСЦЕ, куди буде вставлятися зображення.
2. Виконати Вставлення => Зображення => Із файлу.
3. Вибрати у вікні ВСТАВЛЕННЯ ЗОБРАЖЕННЯ потрібний файл.
4. Вибрати кнопку ВСТАВИТИ.
Я буду думать, что сочетание - набор нулей и единиц, в котором на i-м месте стоит 0, если i-й буквы нет в сочетании, и 1, если она есть. Тогда, например, (0111) соответствует bcd. Общее число чисел по условию N, число единиц равно K. Этот список упорядочен по убыванию, и нам необходимо найти M-е число в этом списке.
Всего число способов выбрать K элементов из N равно C_N^K ("цэ из N по K").
Поймем, например, надо ли брать 1-й элемент. Всего сочетаний, где первый элемент взят: C_(N-1)^(K-1) {в самом деле, в этом случае осталось выбрать K-1 из оставшихся N-1}; не взят: C_(N-1)^K. Учитывая, что те, в которые первый элемент входит, идут перед теми, в которые он не входит, решаем: если M > C_(N-1)^(K-1), 1-й элемент не берём, иначе берём.
Дальше если 1-й взяли, M оставляем таким же, если нет - уменьшаем на C_(N-1)^(K-1).
Процесс повторяем, пока не найдем все буквы.
Осталось понять, как считать C_N^K. Исходя из рассуждений выше, C_N^K = C_(N-1)^(K-1) + C_(N-1)^K. Кроме того, C_N^0 = 1 для всех N, C_N^K = 0 при K < 0 или K > N. Пользуясь этим, можно найти все C_N^K. <span><em>Не забываем про длинную арифметику: C_N^K может не влезать в обычные типы данных. Я буду писать на PascalABC.NET, там длинная арифметика есть - тип BigInteger, если нет - легко найти, как это писать. (Update: в данном случае всё влезет в longint - биномиальные коэффициенты не превысят 10 миллионов с небольшим).</em> </span>
Итак, вот и искомый код:
begin
var N, K: integer;
read(N, K);
var M := ReadString().ToBigInteger();
var C: array[,] of BigInteger := new BigInteger[N, K];
for var j := 1 to K - 1 do
C[0, j] := 0;
for var i := 0 to N - 1 do
C[i, 0] := 1;
for var i := 1 to N - 1 do
for var j := 1 to K - 1 do
C[i, j] := C[i - 1, j] + C[i - 1, j - 1];
var possible := 'a';
while K > 0 do
begin
if M <= C[N - 1, K - 1] then
begin
write(possible);
dec(K);
end
else
M := M - C[N - 1, K - 1];
dec(N);
inc(possible);
end;
end.
Без BigInteger:
begin
var N, K: integer;
var M: longint;
read(N, K, M);
var C: array[,] of longint := new longint[N, K];
for var j := 1 to K - 1 do
C[0, j] := 0;
for var i := 0 to N - 1 do
C[i, 0] := 1;
for var i := 1 to N - 1 do
for var j := 1 to K - 1 do
C[i, j] := C[i - 1, j] + C[i - 1, j - 1];
var possible := 'a';
while K > 0 do
begin
if M <= C[N - 1, K - 1] then
begin
write(possible);
dec(K);
end
else
M := M - C[N - 1, K - 1];
dec(N);
inc(possible);
end;
end.
В таблицу Excel надо занести числовые данные этой задачи (в два столбца):
В верхней ячейке первого столбца пишем его название- "Стоимость"
В ячейки ниже записываем стоимость продуктов по порядку:
35
108,59
54,35
171,63
В верхней ячейке второго столбца пишем "Количество"
<span>В ячейки ниже записываем по порядку количество купленных единиц товара (килограмм, упаковок, пачек):
</span>1
2
3
5
В следующем столбце мы вычислим сумму, которую нужно заплатить за каждый вид товара (нужно стоимость умножить на количество купленных единиц товара). В верхней ячейке столбца запишем "Сумма".
В ячейку ниже вводим формулу: сначала знак равно(=), потом мышкой щёлкаем на ячейку стоимости этого товара, потом знак умножения (*), и мышкой щёлкаем на ячейку количества этого товара. Для ввода формулы нажимаем клавишу Enter.
Первую введённую формулу можно скопировать, и вставить в следующие ячейки этого столбца, или можно формулу в каждой ячейке вводить вручную, как в начальной.
Осталось сложить суммы по всем купленным товарам.
Для этого щёлкаем ячейку под столбцом с вычисленными суммами, и нажимаем клавиши Alt и равно(=). При этом в ячейку автоматически введётся формула суммирования вышестоящих ячеек (с функцией СУММ).
Либо, можно ввести формулу вручную, начав со знака равно, указывая мышкой четыре ячейки с суммами по продуктам, ставя между ними знак плюс.
Получится итоговая сумма 1273,38 рублей.
Также, желательно выделить все ячейки с деньгами, и задать числовой формат отображения (правой кнопкой мыши - формат ячеек - числовой, количество знаков= 2). При этом будет видно два знака после запятой.
Примеры такой таблицы смотрите на приложенных картинках (в двух вариантах- простой расчёт, и таблица с дополнительными сведениями).
// PascalABC.NET 3.1, сборка 1201 от 18.03.2016
begin
var a:=ReadArrInteger(20);
var b:=a.Where(x->x in [10..99]).Where(x->x.IsEven);
if b.Count>0 then Writeln(b.Min)
else Writeln('Не найдено');
end.
<u><em>Тестовое решение:</em></u>
7497 9647 3684 848 6349 37 1281 3739 465 7784 16 406 6936 621 4960 98 1894 3825 3369 6566
16