2# 胖哥的树(tree.cpp/c/pas)

2# 胖哥的树(tree.cpp/c/pas)

Description

问题描述】
胖哥有一棵 n 个节点的树,其中有一些节点是黑色的,另外一些节点是白色的。
考虑这棵树上的一个 k 条边的边集。如果胖哥将这 k 条边从树上删除,则将会把这棵树分成 K+1 个联通块。
现在,胖哥想知道,存在多少种这样的边集,使得删除这些边后,每个联通块只有一个黑色的节点。由于答案可能很大,请将答案 mod 1000000007(10^9+7)。

Format

Input

共三行,第一行包含一个整数 n,表示树的节点的个数。
第二行有 n-1 个整数 P0,P1,...,Pn-2。pi 表示第(i+1)个节点与第 Pi 个节点之间有一条边。假设树的节点的编号是从 0 到 n-1。
第三个有 n 个整数 X0,X1,...,Xn-1(Xi=0 或 1)。如果 Xi等于 1,表示节点 i 是黑色,反之则表示节点 i 是白色。

Output

输出共一行,包含一个整数,表示答案 mod 1000000007。

Sample 1

Input

3
0 0
0 1 1

Output

2

Sample 2

Input

6
0 1 1 0 4
1 1 0 0 1 0

Output

1

Sample 3

Input

10
0 1 2 1 4 4 4 0 8
0 0 0 1 0 1 1 0 0 1

Output

27

【数据说明】
对于 30%的数据,2≤n≤10。
对于 60%的数据,2≤n≤1000。
对于 100%的数据,2≤n≤100000。

Limitation

1s, 256MiB for each test case.

Source

2018年泉州复赛模拟提高组 day3t2