Решите задачу ** Паскале пожалуйста

0 голосов
23 просмотров

Решите задачу на Паскале пожалуйста


image

Информатика | 23 просмотров
0

алгоритм построил, но приходится для простоты использовать множества, а с ними разные версии Паскаля работают по-разному. Укажите точно, какая версия Паскаля у Вас используется: Turbo/Borland Pascal 7.01, FreePascal, Pascal.ABC, PascalABC.Net или что-то иное?

0

Ответа нет, значит будет PascalABC.Net

Дан 1 ответ
0 голосов
Правильный ответ

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





(142k баллов)
0

спасибо вам огромное

0

Пожалуйста