RosettaCodeData/Task/Lah-numbers/PascalABC.NET/lah-numbers.pas

39 lines
804 B
ObjectPascal

function binomial(n, k: integer): biginteger;
begin
result := 1bi;
for var i := 1 to k do
result := result * (n - i + 1) div i;
end;
function factorial(n: integer): biginteger;
begin
result := 1bi;
for var i := 2 to n do
result *= i;
end;
function lah(n, k: integer; signed: boolean := false): biginteger;
begin
if (n = 0) or (k = 0) or (k > n) then result := 0bi
else
if n = k then result := 1bi
else
if k = 1 then result := factorial(n)
else
begin
result := binomial(n, k) * binomial(n - 1, k - 1) * factorial(n - k);
if signed and ((n and 1) <> 0) then result := -result;
end;
end;
begin
for var n := 0 to 12 do
begin
for var k := 0 to n do
print(lah(n, k));
println;
end;
println;
(1..100).Select(k -> lah(100, k)).Max.Println;
end.