noip 模擬賽 正睿oi(一) 給

2021-08-21 17:39:14 字數 997 閱讀 2790

(ca.pas/c/cpp)

【背景描述】

對於任意1 ≤ k ≤ n, 求有多少個左右區分的恰有k個葉子節點的二叉樹, 滿足對於每個節點要麼沒有葉子節點要麼有兩個節點, 同時不存在乙個葉子節點, 使得根到它的路徑上有不少於m條向左的邊。

你只需要求出答案對998244353取模的結果。                    

【輸入格式】

輸入共一行,兩個正整數m, n。

【輸出格式】

輸出n行每行乙個整數, 第i行輸出恰有i個葉子節點的時候的答案對998244353取模的結果。

【樣例輸入】

3 5【樣例輸出】11

248【資料規模和約定】、

對於 20% 的資料, n, m ≤ 8

對於 35% 的資料, n, m ≤ 300

對於 60% 的資料, n, m ≤ 1500

對於 100 的資料, 1 ≤ n, m ≤ 5000

題解說的是啥啊...

本題的思想是拆分建立二叉樹的過程,把乙個點向下分成兩個點的過程分開,變成先出左節點,再出右節點

設狀態f[i][j]代表葉節點總數為i,左邊數與右邊數的差值是j

這樣,當j證明:顯然,能新產生左葉節點的點原來一定是乙個葉節點(因為我們預設先加入左節點),所以如果由這個點向左產生乙個新的節點,那麼原先的葉節點就作廢了,而又新生成了乙個葉節點,這樣葉節點總數是不變的,也就是:

if(j當j>0時,我們可以向右產生乙個節點,而且一定是葉節點,這樣會多一條向右的邊,葉節點個數增加,左右邊差值減小(這就很顯然了,無需證明),即:

if(j>0)

最後,按題目要求,向左的邊數一定等於向右的邊數,於是:

printf("%d\n",f[i][0]%mode);

正睿集訓2021 模擬賽3

題目描述 給定乙個序列 a 保證 a i 互不相同。你需要重新排列 a 使得 a 中任意兩個相鄰位置都包含乙個奇數和偶數。對於每個數,它的代價是 初始位置減重排後的位置 請輸出保證總代價最小的前提下,字典序最小的 a 1 leq n leq 10 5,1 leq a i leq 10 9 題目描述 ...

noip模擬賽(一)魔法樹

魔法樹 mahou.pas c cpp 問題描述 魔法使mored在研究一棵魔法樹。魔法樹顧名思義,這貨是一棵樹 奇葩的是魔法樹上的每一條邊都擁有乙個魔法屬性 如果不那麼奇葩就不是mored的魔法樹了。魔法使mored在研究這棵魔法樹的方法比較奇葩,每一次他會選擇一條路徑 施法。這個魔法是mored...

noip模擬賽(一)寵物之戰

寵物之戰 senso.pas c cpp 問題描述 眾所周知,mored的寵物已經被mored奴役得體無完膚。這只寵物實在忍無可忍,把自己每天走魔法樹的經歷告訴了自己的寵物。同時他還說明了自己爬樹是多麼地慢,以至於mored每天都殘酷地訓練他爬樹。幸運的是mored的寵物的寵物不是mored的寵物,...