#733. 左儿子右兄弟
左儿子右兄弟
题目描述
这天小 在数据结构课上学习了“左儿子右兄弟表示法”。 对于一棵有很多叉树,我们可以通过这一表示法,将其转化成一棵二叉树。
形式化的,给定一棵包含 个节点的有根树 ,节点编号为 ,其中 1 号节点为根节点。我们会通过如下表示法将其转化为一棵同样包含 个节点的以 号节点为根的二叉树 :
- 对于树上的每个节点 ,假设其儿子节点的编号依次为 。
- 你可以对这些儿子节点指定任意顺序,假设为 。
- 在树 中,节点 的左儿子为 ;对于任意 ,节点 的右儿子为 。
我们定义两棵二叉树不同,当且仅当存在一个节点 ,在两棵树中 的左儿子节点编号不同(或其中一个有左儿子,一个没有),或在两棵树中 的右儿子节点编号不同(或其中一个有右儿子,一个没有)。我们定义一个节点的子树大小为其子树中的节点个数(包括它本身)。
小 注意到,在这样的表示法下,最终的树 的形态有很多种可能。
现在给定一棵树 ,在其使用“左儿子右兄弟表示法”最终所有可能得到的树 中,小 定义“好表示”为所有节点子树大小之和最小的那些 。小 想知道“好表示”的 所有节点子树大小之和是多少,以及有多少种不同的“好表示”。
输入格式
- 第一行一个整数 (),代表树上的节点个数。
- 第二行 个整数 (),其中 表示节点 的父节点编号。
输出格式
输出两行,每行一个整数。
- 第一行的整数代表“好表示”的 所有节点子树大小之和。
- 第二行的整数代表“好表示”的 的个数,对 取模。
样例输入 1
5
1 1 2 2
样例输出 1
13
2
样例输入 2
5
1 1 1 1
样例输入 2
15
24
说明
样例解释
对于第一个样例, 使用“左儿子右兄弟表示法”最终可能得到的所有 如下图所示:
第一列的两个 所有节点子树大小之和均为 。
第二列的两个 所有节点子树大小之和均为 。
第三列的两个 所有节点子树大小之和均为 。