main
黄海 2 years ago
parent 9f43b7ed15
commit db5a16dce7

@ -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; // 后缀积取模后的值

@ -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)

Loading…
Cancel
Save