From 90faacf6537b5e91223b082a29aaa142f4df60a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 19 Jan 2024 16:46:10 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/【换根DP】专题.md | 30 ++++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/TangDou/Topic/【换根DP】专题.md b/TangDou/Topic/【换根DP】专题.md index d5c250e..1fc37d6 100644 --- a/TangDou/Topic/【换根DP】专题.md +++ b/TangDou/Topic/【换根DP】专题.md @@ -1320,37 +1320,47 @@ void dfs1(int u, int fa) { 现在考虑换根。 -不难理解,如果$v \in son[u]$,换根时消去 $v$ 对 $u$ 的贡献,再将 $u$ 剩余贡献乘到 $ans[v]$ 上。 +不难理解,如果$v \in son[u]$,换根时消去 $v$ 对 $u$ 的贡献,求出 $u$ 剩余贡献。 - 消去 $v$ 对 $u$ 的贡献: - $\large g[v]=\frac{f[u]}{f[v]+1}$ + $\large x=\frac{f[u]}{f[v]+1}$ - 答案 - $\large ans[v]=g[v] \times f[v]$ + $\large g[v]=g[u] \times x$ 出现问题:**模数不保证是质数**,所以不能用直接乘逆元的方式来取模。 -这里,对于每一个点 $u$,处理出 $f_{v∈son[u]}+1$ 的 **前缀积** 和 **后缀积**,即可解决求出消去一个子树贡献后的答案的问题。 - **除法与模的处理办法** -我们面对的是$g[v]=f[u]/(f[v]+1)$ +我们面对的是$x=f[u]/(f[v]+1)$ -求方案数由于数值太大,肯定会爆掉long long,题目也很 **温馨**(~~恶心~~)给出了使用对$mod$取模的办法进行规避$long$ $long$ 越界。按国际惯例,应该是一路计算过来一路取模,计算式子中出现了除法,联想到了逆元。但费马小定理求逆元要求模必须是质数,现在给定的mod可没有说必须是质数,所以,无法使用逆元来求解。 +求方案数由于数值太大,肯定会爆掉$long$ $long$,题目也很 **温馨**(~~恶心~~)给出了使用对$mod$取模的办法进行规避$long$ $long$ 越界。按国际惯例,应该是一路计算过来一路取模,计算式子中出现了除法,联想到了逆元。但费马小定理求逆元要求模必须是质数,现在给定的$mod$可没有说必须是质数,所以,无法使用逆元来求解。 不让用除法逆元那怎么处理除法+取模呢? 答案就是:**前缀积+后缀积**!! -因为根据题意,$f[u]=(f[v1]+1)*(f[v2]+1)*(f[v3]+1)*(f[v4]+1)*....*$ -不让我用除法,我就不用除法,我只需要记录v的所有哥哥们的贡献乘积%$mod$,和,所以弟弟们的贡献乘积%$mod$,$pre[v]*suff[v]=f[u]/(f[v]+1)$ + +因为根据题意,$f[u]=(f[v_1]+1)*(f[v_2]+1)*(f[v_3]+1)*(f[v_4]+1)*....*$ +不让我用除法,我就不用除法,我只需要记录$v$的所有哥哥们的贡献乘积%$mod$ 和 所有弟弟们的贡献乘积%$mod$: + +$\large pre[v]*suff[v]=f[u]/(f[v]+1)$ ![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401191633824.png) -#### 计算前缀积、后缀积的三种办法 + +总结: +① $f[u]$除掉$v$贡献,也就等于$v$节点的哥哥们贡献前缀积、弟弟们贡献后缀积 +② + + + +#### + +#### 计算前缀积、后缀积的三种办法 **方法$1$** ```cpp {.line-numbers}