М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
Helpmepleasewith
Helpmepleasewith
27.04.2020 19:45 •  Информатика

Решить олимпиадную (9кл). олимиада уже но хочется знать решение. программа на паскале. заранее . петя выписал все сочетания из n первых латинских букв по k букв. в каждом сочетании он выписывал буквы в лексикографическом (словарном) порядке. сочетания он выписывал в лексикографическом порядке по одному в строке. надо узнать какое слово записано в m-ой строке. входные данные: целые числа n, k, m (1< =n< =26, 1< =k< =n, а м не превосходит количества всех выписанных сочетаний). выходные данные: вывести м-ое выписанное сочетание. пример: вх: 4 2 3 вых: ad пояснение: все сочетания в порядке их записи: ab ac ad bc bd cd (третьим по счету сочетанием является ad).

👇
Ответ:
invation
invation
27.04.2020
Я буду думать, что сочетание - набор нулей и единиц, в котором на 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. Не забываем про длинную арифметику: C_N^K может не влезать в обычные типы данных. Я буду писать на PascalABC.NET, там длинная арифметика есть - тип BigInteger, если нет - легко найти, как это писать. (Update: в данном случае всё влезет в longint - биномиальные коэффициенты не превысят 10 миллионов с небольшим). 
Итак, вот и искомый код:
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.
4,7(2 оценок)
Ответ:
Adln48
Adln48
27.04.2020
Var n,k,i,d,m:longint;
    b:array[1..26] of boolean;

procedure writesymbol(j:longint);
begin
write(chr(ord('a')+j-1));
end;

procedure print(x:longint);
var z,h,p:longint;
begin
z := 0;
p := 0;
while true do
begin
p := p + 1;
if b[p] = false then z := z + 1;
if z = x then break;
end;
x := p;
b[x] := true;
writesymbol(x);
end;

function fa_l(a,b:longint):longint;
var s,h:longint;
begin
s := 1;
for h := a to b do s := s * h;
fa_l := s;
end;

begin
read(n,k,m);

d := fa_l(n-k+1,n-1);

for i := k downto 1 do
begin
print((m - 1) div d + 1);
if m mod d = 0 then m := d else
m := m mod d;
d := d div (n - (k - i + 1));
end;
end.
4,8(25 оценок)
Открыть все ответы
Ответ:
Богдан2281667
Богдан2281667
27.04.2020

Объяснение:

Логотип – це графічний символ бренду. Здебільшого, це малюнок, наповнений різними кольорами й символами, з до якого спеціалісти створюють образ, що характеризує діяльність компанії, її товари та послуги. Логотип потрібен також для того, щоб люди могли впізнати поставщика товарів та послуг. Компаніям логотип потрібен для того, щоб виділятися серед конкурентів і мати якусь свою особливість. Зазвичай, логотип організації розміщується на головній сторінці її офіційного сайту. Логотипи можуть бути символічними, текстовими, комбінованими, буквенно-цифровими та у вигляді емблем. Крім того, логотипи відрізняються за формою. Вони можуть бути круглими, трикутними, квадратними, кривими і т.д. Стилістика зображення – це вже задача дизайнера. Логотип повинен бути довговічним, унікальним, універсальним та добре запам’ятовуватися.

4,4(15 оценок)
Ответ:
Четное число делится на два, а кратное пяти делится на пять, поэтому число должно делиться без остатка на 2х5=10

// PascalABC.NET 3.0,сборка 1076
begin
  var n:=ReadInteger('Длина последовательности: ');
  var a:=ArrRandom(n,-50,50);
  Writeln('Исходная последовательность');
  a.Println;
  Writeln('Сумма элементов: ',a.Sum);
  Write('Кол-во четных, кратных пяти: ');
  Writeln(a.Where(x-> x mod 10 = 0).Count)
end.

Тестовое решение:
Длина последовательности: 20
Исходная последовательность
-4 21 -21 -23 14 -39 -12 1 -7 4 17 -45 30 -48 -19 -12 27 -46 -37 15
Сумма элементов: -184
Кол-во четных, кратных пяти: 1
4,5(51 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ