题目链接

第一问白给。

第二问:

设 \(b=y^{-1}\),且以下的 \(Ans\) 是除去 \(y^n\) 的。

设 \(C(T)\) 是固定了 \(T\) 中的边,再连 \(n-|T|-1\) 条边形成一棵树的方案数。设每个联通块的大小为 \(a_1,a_2,\ldots,a_{n-|T|}\),则答案为 \(n^{n-|T|-2}\prod a_i\)。

证明可以使用 Matrix-Tree 定理。

\[\begin{aligned}Ans&=\sum_{T_2}b^{|T_1\cap T_2|} \\&=\sum_S\sum_{T_2}b^{|S|}[T_1\cap T_2=S] \\&=\sum_S\sum_{T_2}b^{|S|}\sum_{S\subseteq T\subseteq T_1\cap T_2}(-1)^{|T|-|S|} \\&=\sum_{T\subseteq T_1}C(T)\sum_{S\subseteq T} b^{|S|}(-1)^{|T|-|S|} \\&=\sum_{T\subseteq T_1}C(T)(b-1)^{|T|} \\&=\sum_{T\subseteq T_1}(b-1)^{|T|}n^{n-|T|-2}\prod_{i=1}^{n-|T|}a_i \\&=n^{n-2}\sum_{T\subseteq T_1}(\frac{b-1}{n})^{|T|}\prod_{i=1}^{n-|T|}a_i \\\end{aligned}
\]

设 \(v=\frac{b-1}{n}\),就是求 \(T_1\) 的每条边选或不选,权值是 \(v^{选的边个数}\times 每个联通块大小之积\),求 \(2^{n-1}\) 种情况的权值之和。

这是之前做过的一个经典的树d,设 \(f_i\) 表示只考虑 \(i\) 的子树的答案,\(g_i\)表示只考虑 \(i\) 的子树,并且不考虑 \(i\) 所在联通块的答案乘上 \(v\)。

\[\begin{aligned}f_u&=f_uf_v+g_uf_v+g_vf_u \\g_u&=g_u(f_v+g_v)\end{aligned}
\]

int bas, f[N], g[N], head[N], to[N << 1], nxt[N << 1];
inline void adde(int a, int b){
static int cnt = 0;
to[++ cnt] = b; nxt[cnt] = head[a]; head[a] = cnt;
}
inline void dfs(int x, int fa = 0){
f[x] = 1; g[x] = bas;
for(Rint i = head[x];i;i = nxt[i]) if(to[i] != fa){
dfs(to[i], x);
f[x] = add((LL) f[x] * f[to[i]] % mod, add((LL) f[x] * g[to[i]] % mod, (LL) g[x] * f[to[i]] % mod));
g[x] = (LL) g[x] * add(g[to[i]], f[to[i]]) % mod;
}
}
inline void main(){
if(y == 1){printf("%d\n", kasumi(n, n - 2)); return;}
bas = (kasumi(y, mod - 2) - 1ll) * kasumi(n, mod - 2) % mod;
for(Rint i = 1;i < n;i ++){
int a, b; scanf("%d%d", &a, &b);
adde(a, b); adde(b, a);
}
dfs(1);
printf("%d\n", (LL) kasumi(n, n - 2) * kasumi(y, n) % mod * f[1] % mod);
}

第三问:

\[\begin{aligned}Ans&=\sum_TC(T)^2\sum_Sb^{|S|}(-1)^{|T|-|S|} \\&=\sum_TC(T)^2(b-1)^{|T|} \\&=\sum_T(b-1)^{|T|}n^{2n-2|T|-4}\prod a_i^2 \\&=\frac{(b-1)^n}{n^4}\sum_T(\frac{n^2}{b-1})^{n-|T|}\prod a_i^2 \\\end{aligned}
\]

设 \(v=\frac{n^2}{b-1}\),于是就变成了,把这 \(n\) 个点分成一些联通块,设大小是 \(a\),每个联通块的权值是 \(va^2\times a^{a-2}=va^a\),求权值之积之和。

\[\begin{aligned}Ans&=n^{-4}(b-1)^nn!\sum_{\sum a_i=n}\frac{a^av}{a!} \\F&=\sum_{k\ge 1}\frac{vk^kx^k}{k!} \\Ans&=n^{-4}(b-1)^nn![x^n]\exp(F)\end{aligned}
\]

// 以上省略贼长的板子
inline void main(){
if(y == 1){printf("%d\n", kasumi(n, 2 * n - 4)); return;}
init(n);
int p = kasumi(y, mod - 2) - 1, b = (LL) n * n % mod * kasumi(p, mod - 2) % mod;
for(Rint i = 1;i <= n;i ++)
A[i] = (LL) b * kasumi(i, i) % mod * invf[i] % mod;
poly_Exp(A, n + 1);
printf("%d\n", (LL) Exp[n] * kasumi(n, mod - 5) % mod * fac[n] % mod * kasumi((LL) y * p % mod, n) % mod);
}

Luogu5206 【WC2019】数树 【容斥,生成函数】的更多相关文章

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

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

  2. [WC2019] 数树

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

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

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

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

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

  5. 【LuoguP5206】[WC2019] 数树

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

  6. [LOJ2983] [WC2019] 数树

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

  7. [BZOJ4455][ZJOI2016]数星星(容斥DP)

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 707  Solved: 419[Submit][Status] ...

  8. bzoj3771: Triple(容斥+生成函数+FFT)

    传送门 咳咳忘了容斥了-- 设\(A(x)\)为斧头的生成函数,其中第\(x^i\)项的系数为价值为\(i\)的斧头个数,那么\(A(x)+A^2(x)+A^3(x)\)就是答案(于是信心满满的打了一 ...

  9. NOIP2019模拟2019.9.20】膜拜大会(外向树容斥,分类讨论)

    传送门. 题解: 我果然是不擅长分类讨论,心态被搞崩了. 注意到\(m<=n-2\),意味着除了1以外的位置不可能被加到a[1]两遍. 先考虑个大概: 考虑若存在\(x,x-1,-,2\)(有序 ...

  10. 5.15 省选模拟赛 容斥 生成函数 dp

    LINK:5.15 T2 个人感觉生成函数更无脑 容斥也好推的样子. 容易想到每次放数和数字的集合无关 所以得到一个dp f[i][j]表示前i个数字 逆序对为j的方案数. 容易得到转移 使用前缀和优 ...

随机推荐

  1. 阿里巴巴 Java 开发手册 (七) 控制语句

    1. [强制]在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止:在一个 switch 块内,都必须包含一个 ...

  2. python 基础(文件)

    文件句柄:可简单理解为应该内存对象 open()函数  参考 https://www.runoob.com/python3/python3-file-methods.html 读.写.追加 ''' t ...

  3. Java之路---Day03

    2019-10-17-21:18:33 方法 定义格式: public static void 方法名称() { 方法体 } 完整格式: 修饰符  返回值类型  方法名称(参数类型  参数名称,... ...

  4. 2019-07-25 PDO

    PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...

  5. C#中的委托、事件及事件的订阅

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. ASP.Net Jquery 随机验证码 文本框判断

    // 登陆验证 $(function () { var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'a', 'B' ...

  7. 企业如何避免错误决策?APS系统帮你忙

    一家企业不论什么事情都是有一定的决策者们,企业的决策者是对整个企业的兴衰成败主宰者主要责任. 战略一词它源于军事,是指为了获得有利的信息而进行的部署计划,那么现在战略合作也是被广泛的应用到商业的以及生 ...

  8. 技术圈术语之LDAP

    导语:阅读一些程序的文档时经常看到支持ldap,由于对这个协议不太熟悉,平时也没有用过,所以一直也没怎么留意,今天看rabbitmq的文档又发现了ldap相关的介绍,于是想把这个问题搞清楚. 一.LD ...

  9. sql 语句中关于 not in 和 null 的问题简单解析

    理解这个问题,只需要记住一个逻辑: null 和任何值比较运算都返回的 false Ex: SQL01: SELECT * FROM userinfo WHERE age NOT IN() SQL01 ...

  10. angularcli 第六篇(todolist 列表)

    1.通过文本框输入,向数组添加数据 <!-- 通过文本框输入,向数组添加数据 push --> <input type="text" name="111 ...