傳說在夜之國中,有一棵包含 $n$ 個節點的彩虹樹。彩虹樹是一棵有根樹,節點編號為 $0\sim n-1$,其中節點 $0$ 是彩虹樹的樹根,節點 $i$($1\le i<n$)的父節點為 $f_i$。
彩虹樹上的每個節點都能顯現出任意顏色。顏色共有無窮多種,但彩虹樹的繽紛度只由每棵子樹中出現過的不同顏色的數量決定,而與具體顏色無關。具體地,設以節點 $i$($0\le i<n$)為根的子樹中共有 $c_i$ 種不同顏色的節點,則彩虹樹的繽紛度可以用序列 $[c_0,c_1,\ldots,c_{n-1}]$ 表示。例如,在下圖中,節點 $0,1,5$ 為藍色,節點 $2,4$ 為紅色,節點 $3$ 為黃色,因此彩虹樹的繽紛度為 $[3,2,1,2,1,1]$。
雲層的變化會導致彩虹樹的色彩顯現出某種特定的規律。具體地,每種規律可以由一個對應的節點子集 $S\subseteq\{1,2,\ldots,n-1\}$ 來描述:集合 $S$ 中的每個節點 $u$ 的顏色都與某個祖先顏色相同。形式化地,對於所有 $u\in S$,均存在 $u$ 的祖先 $p$($p\ne u$),滿足 $u$ 與 $p$ 顏色相同。儘管受到上述規律的制約,彩虹樹仍能呈現出不同的色彩,形成不同的繽紛度。記滿足規律 $S$ 的彩虹樹的繽紛度的種類數為 $w_S$,其中兩種繽紛度不同若且唯若兩個序列中至少有一個元素不同。
請計算,對於所有可能的 $2^{n-1}$ 種規律,滿足每種規律的彩虹樹的繽紛度的種類數之和,即 $\sum_{S\subseteq\{1,2,\ldots,n-1\}}w_S$。由於答案可能較大,只需求出答案對 $998\,244\,353$ 取模後的結果。
實作細節
選手不需要,也不應該實作 main 函式。
選手需要確保提交的程式原始檔包含標頭檔 rainbow.h,即在程式開頭加入以下程式碼:
#include "rainbow.h"
選手需要在提交的程式原始檔 rainbow.cpp 中實作以下函式:
int rainbow(int c, int n, std::vector<int> f);
- $c,n$ 分別表示測試點編號與彩虹樹的節點數。$c=0$ 表示該測試點為範例。
- $f$ 是一個長度為 $n$ 的序列,其中 $f_0=0$,$f_i$($1\le i<n$)表示節點 $i$ 的父節點。
- 該函式需要回傳滿足每種規律的彩虹樹的繽紛度的種類數之和對 $998\,244\,353$ 取模後的結果。
- 對於每個測試點,該函式會被評測程式呼叫恰好一次。
本試題目錄下的 template_rainbow.cpp 是提供的範例程式碼,選手可參考並實作自己的程式碼。
測試程式方式
選手可以在本題目錄下使用如下命令編譯得到可執行檔:
g++ grader.cpp rainbow.cpp -o rainbow -O2 -std=c++14 -static
對於編譯得到的可執行檔 rainbow:
可執行檔將從標準輸入讀入以下格式的資料:
- 第一行包含兩個非負整數 $c,n$。
- 第二行包含 $n-1$ 個非負整數 $f_1,f_2,\ldots,f_{n-1}$。
可執行檔將輸出以下格式的資料至標準輸出:
- 輸出一行一個非負整數表示
rainbow函式的回傳值。
範例
輸入格式 1
0 3 0 0
輸出格式 1
8
說明
- 滿足規律 $S=\varnothing$ 的彩虹樹的繽紛度共有 $[1,1,1],[2,1,1],[3,1,1]$ 三種;
- 滿足規律 $S=\{1\}$ 的彩虹樹的繽紛度共有 $[1,1,1],[2,1,1]$ 兩種;
- 滿足規律 $S=\{2\}$ 的彩虹樹的繽紛度共有 $[1,1,1],[2,1,1]$ 兩種;
- 滿足規律 $S=\{1,2\}$ 的彩虹樹的繽紛度有 $[1,1,1]$ 一種。
因此答案為 $3+2+2+1=8$。
輸入格式 2
0 6 0 1 0 3 1
輸出格式 2
279
範例 3
見選手目錄下的 rainbow/rainbow3.in 與 rainbow/rainbow3.ans。
該範例滿足測試點 $3,4$ 的約束條件。
範例 4
見選手目錄下的 rainbow/rainbow4.in 與 rainbow/rainbow4.ans。
該範例滿足測試點 $5\sim7$ 的約束條件。
範例 5
見選手目錄下的 rainbow/rainbow5.in 與 rainbow/rainbow5.ans。
該範例滿足測試點 $8,9$ 的約束條件。
範例 6
見選手目錄下的 rainbow/rainbow6.in 與 rainbow/rainbow6.ans。
該範例滿足測試點 $10\sim12$ 的約束條件。
資料範圍
對於所有測試資料,均有:
- $1\le n\le200$;
- 對於所有 $1\le i<n$,均有 $0\le f_i<i$。
| 測試點編號 | $n\le$ | 特殊性質 |
|---|---|---|
| $1$ | $4$ | 無 |
| $2$ | $8$ | 無 |
| $3,4$ | $16$ | 無 |
| $5\sim7$ | $50$ | 無 |
| $8,9$ | $10^2$ | B |
| $10\sim12$ | $10^2$ | 無 |
| $13\sim15$ | $150$ | 無 |
| $16$ | $200$ | A |
| $17\sim19$ | $200$ | B |
| $20\sim25$ | $200$ | 無 |
特殊性質 A:對於所有 $1\le i<n$,均有 $f_i=i-1$。
特殊性質 B:對於所有 $0\le i<n$,至多存在兩個 $j$ 滿足 $f_j=i$。