302498: CF482D. Random Function and Tree

Memory Limit:256 MB Time Limit:1 S
Judge Style:Text Compare Creator:
Submit:0 Solved:0

Description

Random Function and Tree

题意翻译

使用下述伪代码对一棵以 1 为根的有根树进行遍历染色: ```cpp int random() { /*等概率返回 0 或 1*/ } int color[]={},now=0; vector<int> son[]; // 存储每个节点的子节点编号集合 int randomdfs(int s) { color=(now=!now)+1; if(random()) sort(son.begin(),son.end()); // 按编号升序排列 else sort(son.rbegin(),son.rend()); // 按编号降序排列 for(int child : son) // 按下标顺序遍历 son集合 if(random()) randomdfs(child); } int main() { /* 进行必要的输入和预处理,树以 1 为根 */ randomdfs(1); } ``` 求一共有多少种不同的可能的 color 数组,结果模 $10^9 + 7$ 。

题目描述

You have a rooted tree consisting of $ n $ vertices. Let's number them with integers from $ 1 $ to $ n $ inclusive. The root of the tree is the vertex $ 1 $ . For each $ i>1 $ direct parent of the vertex $ i $ is $ p_{i} $ . We say that vertex $ i $ is child for its direct parent $ p_{i} $ . You have initially painted all the vertices with red color. You like to repaint some vertices of the tree. To perform painting you use the function paint that you call with the root of the tree as an argument. Here is the pseudocode of this function: `<br></br>count = 0 // global integer variable <br></br><br></br>rnd() { // this function is used in paint code<br></br> return 0 or 1 equiprobably<br></br>}<br></br><br></br>paint(s) {<br></br> if (count is even) then paint s with white color<br></br> else paint s with black color<br></br><br></br> count = count + 1<br></br><br></br> if rnd() = 1 then children = [array of vertex s children in ascending order of their numbers]<br></br> else children = [array of vertex s children in descending order of their numbers]<br></br><br></br> for child in children { // iterating over children array<br></br> if rnd() = 1 then paint(child) // calling paint recursively<br></br> }<br></br>}<br></br>`As a result of this function, some vertices may change their colors to white or black and some of them may remain red. Your task is to determine the number of distinct possible colorings of the vertices of the tree. We will assume that the coloring is possible if there is a nonzero probability to get this coloring with a single call of $ paint(1) $ . We assume that the colorings are different if there is a pair of vertices that are painted with different colors in these colorings. Since the required number may be very large, find its remainder of division by $ 1000000007 $ ( $ 10^{9}+7 $ ).

输入输出格式

输入格式


You have a rooted tree consisting of $ n $ vertices. Let's number them with integers from $ 1 $ to $ n $ inclusive. The root of the tree is the vertex $ 1 $ . For each $ i>1 $ direct parent of the vertex $ i $ is $ p_{i} $ . We say that vertex $ i $ is child for its direct parent $ p_{i} $ . You have initially painted all the vertices with red color. You like to repaint some vertices of the tree. To perform painting you use the function paint that you call with the root of the tree as an argument. Here is the pseudocode of this function: `<br></br>count = 0 // global integer variable <br></br><br></br>rnd() { // this function is used in paint code<br></br> return 0 or 1 equiprobably<br></br>}<br></br><br></br>paint(s) {<br></br> if (count is even) then paint s with white color<br></br> else paint s with black color<br></br><br></br> count = count + 1<br></br><br></br> if rnd() = 1 then children = [array of vertex s children in ascending order of their numbers]<br></br> else children = [array of vertex s children in descending order of their numbers]<br></br><br></br> for child in children { // iterating over children array<br></br> if rnd() = 1 then paint(child) // calling paint recursively<br></br> }<br></br>}<br></br>`As a result of this function, some vertices may change their colors to white or black and some of them may remain red. Your task is to determine the number of distinct possible colorings of the vertices of the tree. We will assume that the coloring is possible if there is a nonzero probability to get this coloring with a single call of $ paint(1) $ . We assume that the colorings are different if there is a pair of vertices that are painted with different colors in these colorings. Since the required number may be very large, find its remainder of division by $ 1000000007 $ ( $ 10^{9}+7 $ ).

输出格式


Print a single integer — the answer to the problem modulo $ 1000000007 $ ( $ 10^{9}+7 $ )

输入输出样例

输入样例 #1

4
1 2 1

输出样例 #1

8

输入样例 #2

3
1 1

输出样例 #2

5

说明

All possible coloring patterns of the first sample are given below. ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF482D/19d967abe6f79007d166ea0e6fd74474e906140d.png)

Input

题意翻译

使用下述伪代码对一棵以 1 为根的有根树进行遍历染色: ```cpp int random() { /*等概率返回 0 或 1*/ } int color[]={},now=0; vector<int> son[]; // 存储每个节点的子节点编号集合 int randomdfs(int s) { color=(now=!now)+1; if(random()) sort(son.begin(),son.end()); // 按编号升序排列 else sort(son.rbegin(),son.rend()); // 按编号降序排列 for(int child : son) // 按下标顺序遍历 son集合 if(random()) randomdfs(child); } int main() { /* 进行必要的输入和预处理,树以 1 为根 */ randomdfs(1); } ``` 求一共有多少种不同的可能的 color 数组,结果模 $10^9 + 7$ 。

加入题单

算法标签: