|
|
|
@ -17,6 +17,8 @@ int mod; // 对 mod 值取模
|
|
|
|
|
int pre[N]; // pre[i]:记录i节点的前缀积对mod取模后的值
|
|
|
|
|
int suff[N]; // suff[i]:记录i节点的后缀和对mod取模后的值
|
|
|
|
|
|
|
|
|
|
// 先递归再统计,以子填父,用儿子们的贡献更新父亲的值。最底层儿子,也就是叶子的贡献值是1,也就是只把它染成黑色,对于这个叶子的父亲而言,
|
|
|
|
|
// 它统计方案时,它认为这个儿子提供的方案数是2,因为儿子也可以不染色,也就是白色。当然,儿子也可以染成黑色,所以它理解为2。
|
|
|
|
|
void dfs1(int u, int fa) {
|
|
|
|
|
f[u] = 1; // 以u为根的子树,不管它是不是有子孙节点,最起码可以把u染成黑色,这样就可以有1种方案
|
|
|
|
|
vector<int> son; // 记录u有哪些儿子,方便后的计算。不使用链式前向星直接枚举的原因在于前向星只能正序枚举,
|
|
|
|
|