Description
Solution
有一点巧妙,但是应该还是比较容易想到的。分析新增节点对于答案的贡献可以发现,转化成二进制后建树会更容易。当遇到某一位为0时,就应当在同一层新增一个节点,若是为1,在新加一个点之后,还应递进到下一层。自己在草稿纸上推一下,从底层算起,每个节点对答案的贡献是他儿子节点的乘积再+1。
Code
var
n,i,sum,s1,s2:longint;
l,r:array[0..1000] of longint;
begin
while not(eof) do
begin
readln(n);
sum:=0;s1:=1;s2:=2;
while n>1 do
begin
if n mod 2=0 then
begin
inc(sum);
l[sum]:=s1;r[sum]:=s2;
inc(s2);
n:=n div 2;
end
else
begin
inc(sum);
l[sum]:=s1;r[sum]:=s2;
s1:=s2;inc(s2);
dec(n);
end;
end;
writeln(s2-1);
for i:=1 to sum do writeln(l[i],' ',r[i]);
end;
end.