【NOIP2017GDKOI】b

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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章