51 lines
1.0 KiB
ObjectPascal
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.
|