划分树
题号:NC200547
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给出一棵 n 个点的树,点编号 1..n , i 号点的点权是 a_i 。
可以通过删边的方式将这棵树划分成一些连通块,求有多少种不同的划分方案,满足:划分后每个连通块的点权异或和均为 M 。
答案对  取模。

输入描述:

第一行两个整数 n, M 。
第二行 n-1 个整数,第 i 个数表示 i+1 号点的父亲编号。
第三行 n 个整数,第 i 个表示 i 号点的点权。
保证  。
保证输入构成一棵树。

输出描述:

输出一行一个整数,表示符合条件的划分方案数对  取模的结果。
示例1

输入

复制
3 0
1 1
0 0 0

输出

复制
4

说明

\emptyset, \{2\}, \{3\}, \{2,3\}
集合内的元素表示删掉它与父亲之间的边.(以 1 号点为根)