NOIP提高組 幻魔皇

2021-07-25 08:45:04 字數 2073 閱讀 5154

幻魔皇拉比艾爾很喜歡斐波那契樹,他想找到神奇的節點對。

所謂斐波那契樹,根是乙個白色節點,每個白色節點都有乙個黑色節點兒子,而每個黑色節點則有乙個白色和乙個黑色節點兒子。神奇的節點對則是指白色節點對。

請問對於深度為n的斐波那契樹,其中距離為i的神奇節點對有多少個?拉比艾爾需要你對於1<=i<=2n的所有i都求出答案。

先看到題目的關鍵字「斐波那契」,就很容易要往斐波那契數列的方向思考。

構建出一顆這樣的樹後可以找到乙個神奇的規律:每一層的白色節點個數是乙個斐波那契數列,只是在前面多了兩項。而黑色節點個數則是正統的斐波那契數列。對於一對白色節點,可以分為兩種情況。第一種:lca為乙個白色節點,即兩個點無分叉關係;第二種情況的lca為乙個黑色節點。

對於第一種情況很明顯是當前層節點個數它子樹的組合。

對於第二種情況就還要列舉乙個lca左邊節點的深度,計算答案也基本相同。 設f

i 表示從某乙個節點開始,向下走i的深度後,對應層的白色節點個數,ti

表示fi

的字首和(c++選手可以直接列舉計和,pascal選手不打容易超時),gi

表示第i層的黑色節點個數,si

表示gi

的字首和。為了方便處理,我們可以把n減1,深度從0開始。

先從第一種情況入手:

因為我們預處理出的fi

是對於任意白色節點而言定義都相同,所以列舉出深度以後,都用合法的開始節點個數乘上從此往下走i步的白色節點數,即fi

∗tn−

i 。

第二種情況稍顯複雜:

首先要想到的是左右相乘,即lca左邊的節點乘上右邊的節點,但是這樣子直接做可能會有重複,所以要研究一下斐波那契數列在這道題目的性質:fi

bi=f

ibi−

1+fi

bi−2

,而這道題中,這兩項就意味著兩個子節點,所以可以用左邊的一半乘上右邊的一半,就能夠避免重複了。

const mo=123456789;

var f,g,s,t:array[0..5005] of int64;

n,i,j,mj,st:longint;

ans:int64;

function

min(x,y:longint):longint;

begin

if xthen

exit(x);exit(y);

end;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x);exit(y);

end;

begin

readln(n);

mj:=2*n; dec(n);

f[0]:=1;t[0]:=1;t[1]:=1;g[1]:=1;s[1]:=1;

for i:=2

to n do

begin

f[i]:=f[i-1]+f[i-2];

if f[i]>=mo then dec(f[i],mo);

t[i]:=t[i-1]+f[i];

if t[i]>=mo then dec(t[i],mo);

g[i]:=g[i-1]+g[i-2];

if g[i]>=mo then dec(g[i],mo);

s[i]:=s[i-1]+g[i];

if s[i]>=mo then dec(s[i],mo);

end;

for i:=1

to mj do

//deep

begin

ans:=0;

if n-i>=0

then ans:=t[n-i]*f[i] mod mo;

st:=1;

if i>n then st:=i-n;

for j:=st to min(i-1,n) do

ans:=(ans+(f[j]*f[i-j-1] mod mo)*s[min(n-j,n-i+j)]) mod mo;

write(ans,' ');

end;

writeln;

end.

NOIP2017提高組模擬12 10 幻魔皇

description 幻魔皇拉比艾爾很喜歡斐波那契樹,他想找到神奇的節點對。所謂斐波那契樹,根是乙個白色節點,每個白色節點都有乙個黑色節點兒子,而每個黑色節點則有乙個白色和乙個黑色節點兒子。神奇的節點對則是指白色節點對。請問對於深度為n的斐波那契樹,其中距離為i的神奇節點對有多少個?拉比艾爾需要你...

NOIP2017提高組模擬12 10 幻魔皇

幻魔皇拉比艾爾很喜歡斐波那契樹,他想找到神奇的節點對。所謂斐波那契樹,根是乙個白色節點,每個白色節點都有乙個黑色節點兒子,而每個黑色節點則有乙個白色和乙個黑色節點兒子。神奇的節點對則是指白色節點對。請問對於深度為n的斐波那契樹,其中距離為i的神奇節點對有多少個?拉比艾爾需要你對於1 i 2n的所有i...

NOIP2015提高組 神奇的幻方

noip2015 提高組 day1 t1 幻方是一種很神奇的 n n 矩陣 它由數字 1,2,3,n n 構成,且每行 每列及兩條對角線上的數字之和都相同。當 n 為奇數時,我們可以通過以下方法構建乙個幻方 首先將 1 寫在第一行的中間。之後,按如下方式從小到大依次填寫每個數 k k 2,3,n n...