ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DTOJ #5859. 树论 题解

2022-06-04 18:33:54  阅读:137  来源: 互联网

标签:prod log 卷积 题解 sum 树论 mu aligned DTOJ


树论

未成年人必须先想 dp。

考虑树形 dp。

我们记 f[u][k] 表示以 \(u\) 为根的子树内,\(u\) 的权值为 \(k\) 的方案数,答案可以直接用 \(f_{u,k} \times k\) 计算。

然后考虑如何转移:

\[\begin{aligned} f_{u,k} &=& \prod_{v\in \operatorname{Son}(u)}\sum_{\gcd(i,k)=1}f_{v,i}\\ &=&\prod_{v}\sum_{i=l_v}^{r_v}f_{v,i}[\gcd(k,i)=1] \end{aligned} \]

反演老套路了。顺便定义 \(f_{v,i}=0(i\not\in[l_v,r_v])\) 以去除烦人的上下界:

\[\begin{aligned} f_{u,k} & = & \prod_v\sum_i f_{v,i} \sum_{d|k,d|i}\mu(d) \\ &=& \prod_v\sum_{d|k}\mu(d)\sum_{d|i}f_{v,i} \end{aligned} \]

嗯。看起来不是很可做,而且让人有种想把第二个和式拆成数论分块的欲望。

不过出现形如 \(\sum_{d|n}\) 的式子,可以回忆一下迪利克雷卷积:

\[f*g(n) = \sum_{d|n} f(d)g(\frac{n}{d}) \]

我们定义一个雷克利迪卷积:

\[f*g(d)=\sum_{d|n} f(n)g(\frac{n}{d}) \]

然后,第二个和式就是 \(f_v*1\) 了,可以 \(O(n\log n)\) 算(因为对于 \(n>r_v\) 时式子为 \(0\),所以只需要考虑到 \(r_v\),即 \(O(r_v\log r_v)\)。

我们记卷出来是 \(g(n)\),那么式子可以变成:

\[f_{u,k} = \prod_v \sum_{d|k}\mu(d)g(d) \]

再定义一个克利迪雷卷积:

\[f*g(n) = \sum_{d|n}f(d)g(d) \]

又是一个可以 \(O(n\log n)\) 求得。我们求出 \(\mu * g(n)\) 记为 \(h(n)\)。

\[f_{u, k} = \prod_{v}h(k) \]

额,直接乘起来就可以了。记 \(A = \max\{r_u\}\),时间复杂度 \(O(nA\log A)\)。

最后还要换根,不过比较简单,删去子树的贡献就乘上逆元即可。

标签:prod,log,卷积,题解,sum,树论,mu,aligned,DTOJ
来源: https://www.cnblogs.com/lingfunny/p/16342391.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有