[LOJ 6285] 花朵(树链剖分+分治ntt)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给出一棵 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,m8×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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值