傳說喺夜之国入面,有一棵包含 $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$。