diff --git a/TangDou/Topic/HuanGenDp/SubTree.cpp b/TangDou/Topic/HuanGenDp/SubTree.cpp index 919675b..628a9f5 100644 --- a/TangDou/Topic/HuanGenDp/SubTree.cpp +++ b/TangDou/Topic/HuanGenDp/SubTree.cpp @@ -34,37 +34,13 @@ void dfs1(int u, int fa) { son.push_back(v); // 将子节点加入集合,方便之后操作 } - // 这里面的t1,t2,其实也可以不用: - // pre[son[0]]:1 - // pre[son[1]]: pre[son[0]] * (f[son[1-1]] + 1) % mod - //... - // pre[son[i]]: pre[son[i-1]] * (f[son[i-1]] + 1) % mod - - // int t1 = 1; // 前缀积取模后的值 - // 记录前缀积 - /* 方法1: - for (int i = 0; i < son.size(); i++) { // 将儿子数组正着枚举 - // 利用静态数组pre,记录每个节点的前缀积取模后的值 - pre[son[i]] = t1; // 到我以前,所有结果的累乘积是多少 - t1 = t1 * (f[son[i]] + 1) % mod; // 我完成后,需要把我的贡献也乘到累乘积中,以便我的下一个节点计算它的累乘积时使用 - } - */ - - // 方法2: - if (son.size() > 0) pre[son[0]] = 1; - for (int i = 1; i < son.size(); i++) - pre[son[i]] = pre[son[i - 1]] * (f[son[i - 1]] + 1) % mod; - - // 方法3: - /* - for (int i = 0; i < son.size(); i++) { - if (i == 0) { - pre[son[i]] = 1; - continue; - } - pre[son[i]] = pre[son[i - 1]] * (f[son[i - 1]] + 1) % mod; - }*/ + int t1 = 1; // 前缀积取模后的值 + for (int i = 0; i < son.size(); i++) { // 将儿子数组正着枚举 + // 利用静态数组pre,记录每个节点的前缀积取模后的值 + pre[son[i]] = t1; // 到我以前,所有结果的累乘积是多少 + t1 = t1 * (f[son[i]] + 1) % mod; // 我完成后,需要把我的贡献也乘到累乘积中,以便我的下一个节点计算它的累乘积时使用 + } // 记录后缀积 int t2 = 1; // 后缀积取模后的值 diff --git a/TangDou/Topic/【换根DP】专题.md b/TangDou/Topic/【换根DP】专题.md index b9dd3ae..4e90380 100644 --- a/TangDou/Topic/【换根DP】专题.md +++ b/TangDou/Topic/【换根DP】专题.md @@ -1306,7 +1306,39 @@ $$\large f_u= \prod_{v \in son_u} (f_v+1) $$ 这里,对于每一个点 $u$,处理出 $f_{v∈son[u]}+1$ 的 **前缀积** 和 **后缀积**,即可解决求出消去一个子树贡献后的答案的问题。 - + +#### 计算前缀积、后缀积的三种办法 + +**方法$1$** +```cpp {.line-numbers} +// 记录前缀积 +int t1 = 1; // 前缀积取模后的值 +for (int i = 0; i < son.size(); i++) { // 将儿子数组正着枚举 + // 利用静态数组pre,记录每个节点的前缀积取模后的值 + pre[son[i]] = t1; // 到我以前,所有结果的累乘积是多少 + t1 = t1 * (f[son[i]] + 1) % mod; // 我完成后,需要把我的贡献也乘到累乘积中,以便我的下一个节点计算它的累乘积时使用 +} +``` + +**方法$2$** +```cpp {.line-numbers} +// 方法2: +if (son.size() > 0) pre[son[0]] = 1; +for (int i = 1; i < son.size(); i++) + pre[son[i]] = pre[son[i - 1]] * (f[son[i - 1]] + 1) % mod; +``` + +**方法$3$** +```cpp {.line-numbers} +// 方法3: +for (int i = 0; i < son.size(); i++) { + if (i == 0) { + pre[son[i]] = 1; + continue; + } + pre[son[i]] = pre[son[i - 1]] * (f[son[i - 1]] + 1) % mod; +} +``` #### [$AcWing$ $1148$ 秘密的牛奶运输](https://www.cnblogs.com/littlehb/p/16054005.html)