QBHV - Hoán vị chữ cái
Tác giả: flashmt
Ngôn ngữ: Pascal
var d:array['A'..'Z'] of byte;
com:array[1..9,0..9] of longint;
s:string;
n:byte;
dem:longint;
procedure init;
var i,j:byte; c:char;
begin
fillchar(com,sizeof(com),0);
for i:=1 to n do
begin
com[i,0]:=1; com[i,i]:=1;
end;
for i:=2 to n do
for j:=1 to i-1 do
com[i,j]:=com[i-1,j]+com[i-1,j-1];
dem:=1;
i:=n;
for c:='A' to 'Z' do
if d[c]>0 then
begin
dem:=dem*com[i,d[c]];
i:=i-d[c];
end;
end;
procedure rf;
var c:char;
begin
n:=0;
fillchar(d,sizeof(d),0);
while not eof do
begin
inc(n);
read(c);
inc(d[c]);
end;
end;
procedure att(i:byte);
var c:char; j:byte;
begin
for c:='A' to 'Z' do
begin
if d[c]>0 then
begin
dec(d[c]);
s:=s+c;
if i<n then att(i+1)
else writeln(s);
inc(d[c]);
delete(s,i,1);
end;
end;
end;
procedure pr;
var i:byte;
begin
init;
s:='';
writeln(dem);
att(1);
end;
begin
rf;
pr;
end.