NOIP2017提高組模擬12 10 幻魔皇

2021-07-25 09:23:31 字數 2002 閱讀 1132

description

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

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

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

input

一行乙個正整數n。

output

一行2n個整數表示答案,對123456789取模。

sample input

sample output

0 2 3 3 1 1 0 0 0 0

data constraint

對於20%的資料n<=10;

對於40%的資料n<=20;

對於60%的資料n<=30;

對於80%的資料n<=400;

對於100%的資料n<=5000。

我們可以先把樹給畫出來,然後就可以發現乙個特殊的性質。

將就將就著吧。。。不怎麼會畫表。。。

我們發現每層的黑點數滿足斐波那契,

每層的白點從第二層開始滿足斐波那契數列。

我們分成兩種情況進行討論。

首先先定幾個陣列

white表示白

black表示黑

pre表示1~i層的總共白點數

ans為答案。

1.

白點對的lca為其中的乙個白點。我們只需要列舉距離,計算答案即可。 an

s[i]

=pre

[n−i

]∗wh

ite[

i+1]

(pre[n-i]表示1-(n-i)層總共的白點數,這些白點都可以再向下延伸i個長度,

白點下面連線的是一顆形如從第二層黑點開始的子樹,

所以是white[i+1]而不是white[i])

2.

白點對的lca為黑點。這樣如果直接列舉兩個深度的白點個數相乘是不對的,為什麼?

因為你所列舉的兩個白點有可能在同一條路徑上,這樣就不合法了。

所以我們考慮兩條路徑從lca黑點的黑白兩個兒子中各取乙個。

那麼原本我們要求兩條長度為i,j的路徑合成乙個i+j的路徑,

就變成了從黑兒子中選一條長度i-1的路徑,

從白兒子中選一條長度j-1的路徑。

他的黑兒子是一顆形如從第二層黑點開始的子樹,所以個數為white[i+1],

而白兒子就是從第一層直接開始的路徑,

也就是white[i]實際表示的是與lca黑點相距i+1的白點,所以個數是white[j].

簡單式子可以寫成如下 an

s[i+

j]=(

ans[

i+j]

+(ll

)(pr

e[n−

max(

i,j)

+1]−

1)∗(

ll)w

hite

[i]

#include 

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

using

namespace

std;

typedef

long

long ll;

const

int n = 5010,mo = 123456789;

int black[n],pre[n],white[n],n;

ll ans[n * 2];

int main()

Noip2017提高組 乳酪

noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...

NOIP2017提高組 列隊

noip2017提高組 day2 t3 sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n m 名學生,方陣的行數為 n,列數為 m 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...

NOIP 2017 提高組 寶藏

傳送門 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n nn 個深埋在地下的寶藏屋,也給出了這 n nn 個寶藏屋之間可供開發的 m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發...