简要题意

给定 \(n, y\)。

一张图有 \(|V| = n\) 个点,现在给出两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\)。

定义这两棵树的权值 \(F(E_1, E_2)\) 为 \(y\) 的 \(G'=(V,E_1\cap E_2)\) 的联通块个数次方。

即 \(F(E_1, E_2) = y^{n - |E_1\cap E_2|}\),给定 \(E_1\),计算 \(\sum_{E_2} F(E_1, E_2)\)。

其中 \(n\le 10^5\)。答案对 \(998244353\) 取模。

解题思路

首先我们要找到一个合适的形式来表示我们的答案,部分枚举 \(S=E_1\cap E_2\),则答案为:

\[\sum_{E_2} \sum_{S=E_1\cap E_2} y^{n-|S|}
\]

其中 \(S=E_1\cap E_2\) 这个恰好的条件限制较强,考虑容斥将限制弱化为 \(S\subseteq E_1\cap E_2\).

不妨考虑这样一个容斥原理的式子:

\[f(S)=\sum_{T\subseteq S}\sum_{P\subseteq T}(-1)^{|T|-|P|}f(P)
\]

代入到原来的式子中,得到:

\[\begin{aligned}
&\sum_{E_2} \sum_{S=E_1\cap E_2} y^{n-|S|}\\
=&\sum_{E_2} \sum_{T\subseteq E_1\cap E_2} \sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\
=&\sum_{T\subseteq E_1}g(T)\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}\sum_{P\subseteq T}(-y)^{|T|-|P|}\\
=&\sum_{T\subseteq E_1}g(T)\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}\sum_{|P|=0}^{|T|}\binom{|T|}{|P|}(-y)^{|T|-|P|}\\
=&\sum_{T\subseteq E_1}g(T)\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}(1-y)^{|T|}\\
\end{aligned}
\]

其中 \(g(T)\) 表示包含边集 \(T\) 的 \(E_2\) 的个数。

假设 \(G=(V,T)\) 为一个由 \(k\) 个大小分别为 \(a_i\) 的连通块组成的森林,则:

\[g(T)=n^{k-2}\prod_{i=1}^ka_i
\]

继续代入 (注意到 \(n=|T|+k\) ),得:

\[\begin{aligned}
&\sum_{T\subseteq E_1}g(T)y^{n-|T|}(1-y)^{|T|}\\
=&\sum_{T\subseteq E_1}n^{k-2}\prod_{i=1}^ka_i\ y^k(1-y)^{n-k}\\
=&\frac{(1-y)^n}{n^2}\sum_{T\subseteq E_1}\prod_{i=1}^k\frac{ny}{1-y}\ a_i
\end{aligned}
\]

即一个大小为 \(a\) 的连通块为答案贡献一个乘积 Ka,其中 \(K = \frac{ny}{1-y}\)。

据此可以容易得到一个 \(O(n^2)\) 的 DP,\(f(x,i)\) 表示 \(x\) 的子树中,\(x\) 所在的连通块大小为 \(i\) 的答案。

考虑到这个贡献可以拆分表示为 \(\prod_{i=1}^k(K+K+K+\cdots K)\),故合并两个大小分别为 \(x,y\) 的连通块时,新的贡献其实就是 \(K(x+y)\prod_{i\ne now}Ka_i\).

这样状态可以优化为 \(f(x,0/1)\) 表示 \(x\) 的子树中,当前连通块是否已经做出贡献。

那么转移就是 (前面是选边 \((x,y)\),后面是不选):

\[\begin{aligned}
&f(x,1)=f(x,1)f(y,1)\ +\ f(x,1)f(y,0)+f(x,0)f(y,1)\\
&f(x,0)=f(x,0)f(y,1)\ +\ f(x,0)f(y,0)
\end{aligned}
\]

代码

void dfs(int x, int fx){
siz[x] = 1, f[x] = coef, g[x] = 1;
for(int i = head[x]; i; i = e[i].nx){
int y = e[i].to; if(y == fx) continue;
dfs(y, x);
int sum = Mod((LL) f[x] * g[y] % mod + (LL) g[x] * f[y] % mod - mod);
MOD(f[x] = (LL) f[x] * f[y] % mod + sum - mod);
MOD(g[x] = (LL) g[x] * f[y] % mod + (LL) g[x] * g[y] % mod - mod);
}
} void solve(){
coef = (LL) n * y % mod * qpow(1 - y + mod) % mod;
dfs(1, 0);
cout << (LL) f[1] * qpow(1 - y + mod, n) % mod * qpow((LL) n * n % mod) % mod << endl;
}

[题解][P5206][WC2019] 数树 (op = 1)的更多相关文章

  1. 洛谷P5206 [WC2019] 数树(生成函数+容斥+矩阵树)

    题面 传送门 前置芝士 矩阵树,基本容斥原理,生成函数,多项式\(\exp\) 题解 我也想哭了--orz rqy,orz shadowice 我们设\(T1,T2\)为两棵树,并定义一个权值函数\( ...

  2. 并不对劲的bzoj5475:loj2983:p5206:[wc2019]数树

    题目大意 task0:有两棵\(n\)(n\leq10^5)个点的树\(T1,T2\),每个点的点权可以是一个在\([1,y]\)里的数,如果两个点既在\(T1\)中有直接连边,又在\(T2\)中有直 ...

  3. 洛谷 P5206 - [WC2019]数树(集合反演+NTT)

    洛谷题面传送门 神仙多项式+组合数学题,不过还是被我自己想出来了( 首先对于两棵树 \(E_1,E_2\) 而言,为它们填上 \(1\sim y\) 使其合法的方案数显然是 \(y\) 的 \(E_1 ...

  4. 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]

    传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...

  5. 洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树

    一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一. 题目传送门:洛谷P5206. 题意简述: 给定 \(n, y\). 一张图有 \(|V| = n\) 个点.对于两棵树 \ ...

  6. [WC2019] 数树

    [WC2019] 数树 Zhang_RQ题解(本篇仅概述) 前言 有进步,只做了半天.... 一道具有极强综合性的数数好题! 强大的多合一题目 精确地数学推导和耐心. 有套路又不失心意. 融合了: 算 ...

  7. [LOJ2983] [WC2019] 数树

    题目链接 LOJ:https://loj.ac/problem/2983 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5475 洛谷:https ...

  8. BZOJ5475 WC2019数树(prufer+容斥原理+树形dp+多项式exp)

    因为一大堆式子实在懒得写题解了.首先用prufer推出CF917D用到的结论,然后具体见前言不搭后语的注释. #include<iostream> #include<cstdio&g ...

  9. 【LuoguP5206】[WC2019] 数树

    题目链接 题意 定义 \(F(T_1,T_2)=y^{n-common}\) 其中 \(common\) 为两棵树 \(T_1,T_2\) 的公共边条数. 三种问题 1.给定 \(T_1,T_2\) ...

随机推荐

  1. JVM内存模型小结

    JVM运行时的数据区域划分图如下,该图是JVM内存模型最主要的内容. 从图中可以看出来,JVM将内存主要划分为五个部分:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区.这些被划分为用途不 ...

  2. brew 安装redis

    转:https://www.jianshu.com/p/e1e5717049e8 编辑新安装php的 p.p1 { margin: 0; font: 11px Menlo; color: rgba(0 ...

  3. 去掉win10的命令行

    FluentTerminal 和xshell类似,多个终端在一个页面,比较舒服,可复制,可粘贴 界面: https://github.com/felixse/FluentTerminal 自己去git ...

  4. Spring根据路径前缀获取不同Resource

    相关文章:https://www.jianshu.com/p/5bab9e03ab92 官方文档:https://docs.spring.io/spring/docs/current/spring-f ...

  5. Django的多数据库与读写分离

    1.多个数据库 settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.pa ...

  6. 学习MFS(五)

     ########################################################## mfs master 安装 建议 cp eth0 eth0:0 ifup eth ...

  7. 【推理引擎】如何在 ONNXRuntime 中添加新的算子

    如果模型中有些算子不被ONNX算子库支持,我们就需要利用ONNXRuntime提供的API手动添加新算子.在官方文档中已经对如何添加定制算子进行了介绍(https://onnxruntime.ai/d ...

  8. 老版本的Spring应用该如何应对CVE-2022-22965漏洞?

    昨天,在发布了<Spring官宣承认网传大漏洞,并提供解决方案>之后.群里就有几个小伙伴问了这样的问题:我们的Spring版本比较老,该怎么办?这是一个好问题,所以DD今天单独拿出来说说. ...

  9. python-使用函数输出指定范围内Fibonacci数的个数

    本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目. 所谓Fibonacci数列 ...

  10. 【Android开发】通过 style 设置状态栏,导航栏等的颜色

    <style name="test"> <!--状态栏颜色--> <item name="colorPrimaryDark"> ...