информатика

Помогите, пожалуйста, решить олимпиадную задачу (9кл). Олимиада уже прошла, но хочется знать решение. Программа на Паскале. Заранее спасибо. Петя выписал все сочетания из N первых латинских букв по K букв. В каждом сочетании он выписывал буквы в лексикографическом (словарном) порядке. Сочетания он выписывал в лексикографическом порядке по одному в строке. Надо узнать какое слово записано в M-ой строке. Входные данные: целые числа N, K, M (1<=N<=26, 1<=K<=N, а М не превосходит количества всех выписанных сочетаний). Выходные данные: вывести М-ое выписанное сочетание. Пример:  вх: 4 2 3 вых: ad Пояснение: все сочетания в порядке их записи: ab ac ad bc bd cd (третьим по счету сочетанием является ad).

Оставить ответ
1

Ответ №1

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.

Знаете ответ?