• CF997D Cycles in product


    题意

    给你大小为 \(n_1, n_2\)​的两棵树 \(T_1, T_2\)​,构造一张新图,该图中每一个点的编号为 \((u,v)\)。如果在 \(T_1\) ​中, \(u_1\) ​和\(u_2\) ​之间有边,那么在该图上,对于任意 \(1\le v\le n_2\)\((u_1, v)\)\((u_2, v)\) 之间有边。同样,如果在 \(T_2\) ​中,\(v_1\) ​和\(v_2\)​之间有边,那么在图上,对于任意 \(1\le u\le n_1\)\((u, v_1)\)\((u, v_2)\) 之间有边.
    求这个图上长度为 \(K\) 的环有多少个,环可以不为简单环,起始点或方向不同的环视为不同的环.

    \(n_1, n_2\le 4000, K\le 75\),答案对 \(998244353\) 取模.

    题解

    \(T_1\) 上一个长度为 \(K_1\) 的环和 \(T_2\) 上一个长度为 \(K_2\) 的环以不同方式组合对应图上 \(\begin{pmatrix}K_1+K_2\\k_1\end{pmatrix}\) 个环
    即答案为 \(\sum\limits_{0\le i\le K}F1_i\times F2_{K-i}\times\begin{pmatrix}K\\i\end{pmatrix}\),其中 \(F1_i\) 表示 \(T_1\) 上长度为 \(i\) 的环的个数,\(F2_i\) 表示 \(T_2\) 上长度为 \(i\) 的环的个数

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

    \[f_{u,k}=\sum_{0\le t<k}f_{u,t}\sum_{v\in \text{son}_u}f_{v,k-t-1} \]

    \(h_{u,k}=\sum_{v\in \text{son}_u}f_{v,k-t-1}\),有

    \[f_{u,k}=\sum_{0\le t<k}f_{u,t}\times h_{u, k-t-1} \]

    换根DP维护 \(h\),再通过 \(h\) 计算 \(f\)
    \(\Theta((n_1+n_2)\times K^2)\) 足以通过此题

    代码 codeforces submission 143516835

    优化

    复杂度瓶颈在 \(f\) 的计算,考虑优化这一过程

    \(h'_{u,k}=h_{u,k-1}\),有

    \[f_{u,k}=\sum_{0\le t<k}f_{u,t}\times h'_{u,k-t} \]

    \(G_u(x)=\sum_{1\le i\le k}h'_{u,i}\times x^i\),有

    \[\begin{align*}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{align*} \]

    多项式快速幂和求逆可以做到 \(\Theta((n_1+n_2)K\log K)\) 的复杂度

  • 相关阅读:
    mvc原理和mvc模式的优缺点
    Paxos算法详细图解
    环境搭建
    elasticsearch 安装
    redis rdb文件解析
    eclipse 远程调试
    java 解析xml
    理想化 redis
    redis 内存
    工作圈redis 使用
  • 原文地址:https://www.cnblogs.com/gzezfisher/p/cf997d.html
Copyright © 2020-2023  润新知