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.