CF997D Cycles in product

题意

给你大小为 n1,n2n_1, n_2​的两棵树 T1,T2T_1, T_2​,构造一张新图,该图中每一个点的编号为 (u,v)(u,v)。如果在 T1T_1 ​中, u1u_1 ​和u2u_2 ​之间有边,那么在该图上,对于任意 1vn21\le v\le n_2(u1,v)(u_1, v)(u2,v)(u_2, v) 之间有边。同样,如果在 T2T_2 ​中,v1v_1 ​和v2v_2​之间有边,那么在图上,对于任意 1un11\le u\le n_1(u,v1)(u, v_1)(u,v2)(u, v_2) 之间有边
求这个图上长度为 KK 的环有多少个,环可以不为简单环,起始点或方向不同的环视为不同的环

n1,n24000,K75n_1, n_2\le 4000, K\le 75,答案对 998244353998244353 取模.

题解

T1T_1 上一个长度为 K1K_1 的环和 T2T_2 上一个长度为 K2K_2 的环以不同方式组合对应图上 (K1+K2k1)\begin{pmatrix}K_1+K_2\\k_1\end{pmatrix} 个环
即答案为 0iKF1i×F2Ki×(Ki)\sum\limits_{0\le i\le K}F1_i\times F2_{K-i}\times\begin{pmatrix}K\\i\end{pmatrix},其中 F1iF1_i 表示 T1T_1 上长度为 ii 的环的个数,F2iF2_i 表示 T2T_2 上长度为 ii 的环的个数

我们把每个点作为起始点分别计算,考虑到树上所有的环长度均为偶数,令 fu,kf_{u, k} 表示以 uu 为起始点,长度为 2×k2\times k 的环的个数,有 F2×k=ufu,kF_{2\times k}=\sum\limits_u f_{u, k}
由于从父亲节点往儿子节点转移十分困难,不妨对于每个点只考虑在其子树中的环然后换根DP

考虑转移
fu,k=0t<kfu,tvsonufv,kt1 f_{u,k}=\sum_{0\le t<k}f_{u,t}\sum_{v\in \text{son}_u}f_{v,k-t-1} hu,k=vsonufv,kt1h_{u,k}=\sum\limits_{v\in \text{son}_u}f_{v,k-t-1},有
fu,k=0t<kfu,t×hu,kt1 f_{u,k}=\sum_{0\le t<k}f_{u,t}\times h_{u, k-t-1} 换根DP维护 hh,再通过 hh 计算 ff
Θ((n1+n2)×K2)\Theta((n_1+n_2)\times K^2) 足以通过此题

代码 codeforces submission 143516835

优化

复杂度瓶颈在 ff 的计算,考虑优化这一过程

hu,k=hu,k1h'_{u,k}=h_{u,k-1},有 fu,k=0t<kfu,t×hu,kt f_{u,k}=\sum_{0\le t<k}f_{u,t}\times h'_{u,k-t} Gu(x)=1ikhu,i×xiG_u(x)=\sum_{1\le i\le k}h'_{u,i}\times x^i,有 fu,k=[xk]1ikGu(x)i=[xk]Gu(x)k+1Gu(x)Gu(x)1 \begin{aligned}f_{u,k}&=[x^k]\sum_{1\le i\le k}G_u(x)^i\\&=[x^k]\frac{G_u(x)^{k+1}-G_u(x)}{G_u(x)-1}\end{aligned} 多项式快速幂和求逆可以做到 Θ((n1+n2)KlogK)\Theta((n_1+n_2)K\log K) 的复杂度

CF997D Cycles in product

https://gzezfisher.top/cf997d/

作者

Fisher Cai

发布于

2022-01-26

更新于

2025-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×