Type
ndigits=1..9;
kdigits=1..100;
nSet=set of ndigits;
kSet=set of kdigits;
function Factorial(n:ndigits):longint;
var
i:ndigits;
p:longint;
begin
p:=1;
for i:=2 to n do p:=p*i;
Factorial:=p
end;
function PowerOfSet(p:nSet):ndigits;
{ возвращает мощность множества из элементов типа ndigits }
var
i,n:ndigits;
begin
n:=0;
for i:=1 to 9 do
if i in p then Inc(n);
PowerOfSet:=n
end;
var
m,n:ndigits;
k,d,i:kdigits;
res:longint;
sn:nSet;
sk:kSet;
flag:boolean; { True, если из sk нельзя построить размещение для sn }
begin
Read(n,k);
sk:=[];
{
Формируем множество sk. Если делается попытка добавить
уже имеющийся элемент или элемент со значением больше 9,
Flag устанавливается в True
}
flag:=false;
for i:=1 to k do begin
Read(d);
if (d in sk) then flag:=true
else sk:=sk+[d];
flag:=flag or (d>9);
end;
if flag then res:=Factorial(n)
else begin
for i:=1 to n do sn:=sn+[i];
if (sk-sn)<>[] then res:=Factorial(n)
else begin
m:=PowerOfSet(sn-sk);
res:=Factorial(n)-Factorial(m)
end
end;
Writeln(res)
end.
Тестовые решения:
3 2
2 1
5
5 2
4 4
120
5 6
2 3 9 5 6 6
120
9 3
1 7 4
362160