RosettaCodeData/Task/Paraffins/PascalABC.NET/paraffins.pas

51 lines
1.0 KiB
ObjectPascal

const
nMax = 250;
nBranches = 4;
var
rooted := (0..nMax).Select(n -> 0bi).ToArray;
unrooted := (0..nMax).Select(n -> 0bi).ToArray;
function choose(m: biginteger; k: integer): biginteger;
begin
result := m;
if k = 1 then exit
else
for var i := 1 to k - 1 do
result := result * (m + i) div (i + 1)
end;
procedure tree(br, n, l, sum: integer; cnt: biginteger);
begin
var s := 0;
foreach var b in (br + 1.. nBranches) do
begin
s := sum + (b - br) * n;
if s > nMax then exit;
var c := choose(rooted[n], b - br) * cnt;
if l * 2 < s then unrooted[s] += c;
if b = nBranches then exit;
rooted[s] += c;
for var m := n - 1 downto 1 do
tree(b, m, l, s, c);
end;
end;
procedure bicenter(s: integer);
begin
if (s and 1) = 0 then
unrooted[s] += rooted[s div 2] * (rooted[s div 2] + 1) div 2;
end;
begin
(rooted[0], rooted[1], unrooted[0], unrooted[1]) := (1bi, 1bi, 1bi, 1bi);
for var n := 1 to nMax do
begin
tree(0, n, n, 1, 1bi);
bicenter(n);
writeln(n, ': ', unrooted[n]);
end;
end.