题意
给出一棵 n n n 个点的树,每个点有点权 v i v_i vi,选出 m m m 个不相邻的点,代价为这 m m m 个点的权值之积。求所有合法方案的代价和,对 998244353 998244353 998244353 取模。
n , m ≤ 8 × 1 0 4 , v i < 998244353 n,m\le 8\times 10^4,v_i <998244353 n,m≤8×104,vi<998244353。
分析
令 d p 0 , u , j dp_{0,u,j} dp0,u,j 表示来到节点 u u u,不选节点 u u u,总共选了 j j j 个点的代价和; d p 1 , u , j dp_{1,u,j} dp1,u,j 表示来到节点 u u u,选了节点 u u u,总共选了 j j j 个点的代价和。容易看出转移是个树形背包,可以在 O ( n 2 ) O(n^2) O(n2) 内转移。
进一步的,我们发现转移是个卷积操作,于是令 d p 0 , u dp_{0,u} dp0,u 表示来到节点 u u u,不选节点 u u u 的生成函数, d p 1 , u dp_{1,u} dp1,u 表示来到节点 u u u,选了节点 u u u 的生成函数,于是有以下转移:
d p 0 , u = ∏ ( u , v ) ( d p 0 , v + d p 1 , v ) d p 1 , u = ( v u x ) ( ∏ ( u , v ) d p 0 , v ) dp_{0,u}=\prod\limits_{(u,v)}(dp_{0,v}+dp_{1,v})\\ dp_{1,u}=(v_u x)(\prod\limits_{(u,v)}dp_{0,v}) dp0,u=(u,v)∏(dp0,v+dp1,v)dp1,u=(vux)((u,v)∏dp0,v)
可以用 n t t ntt ntt 优化,但是总的复杂度变成了 O ( n 2 l o g n ) O(n^2logn) O(n2logn),还不如不优化=.=。
可以考虑树剖,令 F 0 , u = ∏ ( u , v ) , v ≠ s o n u ( d p 0 , v + d p 1 , v ) , F 1 , u = ( v u x ) ∏ ( u , v ) , v ≠ s o n u d p 0 , v F_{0,u}=\prod\limits_{(u,v),v\neq son_u}(dp_{0,v}+dp

这是一篇关于利用树链剖分和分治结合数位线性变换(NTT)解决LOJ 6285题目——花朵的算法文章。博主详细分析了树形背包问题,并提出通过生成函数和矩阵快速幂进行O(nlog^3n)复杂度的优化解法。
最低0.47元/天 解锁文章
676

被折叠的 条评论
为什么被折叠?



