link

题目大意:

n个节点的带标号无根树。每次选择一个度数为1的节点并将它从树上移除。问总共有多少种不同的方式能将这棵树删到只剩 1 个点。两种方式不同当且仅当至少有一步被删除的节点不同。

题解:

先考虑1号店最后移除时候的贡献,我们可以钦定1号点为根,并钦定他最后移除

然后就是一个树形dp

设\(f_i\)表示i号点子树移除方案数量,\(size_i\)表示1为根时子树大小

显然有dp式子\(f_x=\frac{(size_x-1)!}{\prod (size_i)!}\prod f_i\) (满足1为根时x是i的爹)

然后最后移除点1的情况的贡献就算出来了

我们考虑换根

先考虑x的转移少了j这个子树节点会咋样

那么\(f'_x=f_x/f_j/(size_x-1)!*(size_x-1-size_j)!*(size_j)!\)

注意这里的\(size_x\)是n,我们已经假设x是树的根了

然后我们再把\(f'_x\)转移到j上去,则新的j有

\(f'_j=f_j*f'_x/(size_j-1)!*(n-1)!/(n-size_i)!\)

由于涉及到求逆元,时间复杂度为\(O(n\log n)\)

#include <cstdio>
#include <vector>
using namespace std; const int xkj = 998244353; int n;
vector<int> out[100010];
int sz[100010], fa[100010], f[100010];
int fac[100010], inv[100010], ans; int qpow(int x, int y)
{
int res = 1;
for (x %= xkj; y > 0; y >>= 1, x = x * (long long)x % xkj)
if (y & 1) res = res * (long long)x % xkj;
return res;
} void dfs1(int x)
{
sz[x] = 1, f[x] = 1;
for (int i : out[x]) if (fa[x] != i)
{
fa[i] = x, dfs1(i), sz[x] += sz[i];
f[x] = f[x] * (long long)f[i] % xkj;
f[x] = f[x] * (long long)inv[sz[i]] % xkj;
}
f[x] = f[x] * (long long)fac[sz[x] - 1] % xkj;
} void dfs2(int x)
{
ans = (ans + f[x]) % xkj;
for (int i : out[x]) if (fa[x] != i)
{
int tmp = f[x] * (long long)qpow(f[i], xkj - 2) % xkj * fac[sz[i]] % xkj * inv[n - 1] % xkj * fac[n - 1 - sz[i]] % xkj;
int sb = f[i] * (long long)tmp % xkj * inv[sz[i] - 1] % xkj * fac[n - 1] % xkj * inv[n - sz[i]] % xkj; f[i] = sb;
dfs2(i);
}
} int main()
{
scanf("%d", &n);
fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * (long long)i % xkj;
inv[n] = qpow(fac[n], xkj - 2);
for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * (long long)i % xkj;
for (int x, y, i = 1; i < n; i++) scanf("%d%d", &x, &y), out[x].push_back(y), out[y].push_back(x);
dfs1(1), dfs2(1);
printf("%d\n", ans);
return 0;
}

牛客挑战赛30-T3 小G砍树的更多相关文章

  1. 牛客挑战赛 30 A 小G数数

    题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...

  2. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  3. 5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题

    LINK:小V和字符串 容易想到只有1个数相同的 才能有贡献. 知道两个01串 那么容易得到最小步数 大体上就是 第一个串的最前的1和第二个串最前的1进行匹配. 容易想到设f[i][j]表示 前i位1 ...

  4. 5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制

    LINK:小V的序列 考试的时候 没想到正解 于是自闭. 题意很简单 就是 给出一个序列a 每次询问一个x 问序列中是否存在y 使得x^y的二进制位位1的个数<=3. 容易想到 暴力枚举. 第一 ...

  5. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  6. 【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)

    点此看题面 大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数. 暴力式子 首先我们来考虑 ...

  7. NowCoder--牛客练习赛30 C_小K的疑惑

    题目链接 :牛客练习赛30 C_小K的疑惑 i j k 可以相同 而且 距离%2 只有 0 1两种情况 我们考虑 因为要 d(i j)=d(i k)=d(j k) 所以我们只能找 要么三个点 任意两个 ...

  8. 牛客小白月赛13-J小A的数学题 (莫比乌斯反演)

    链接:https://ac.nowcoder.com/acm/contest/549/J来源:牛客网 题目描述 小A最近开始研究数论题了,这一次他随手写出来一个式子,∑ni=1∑mj=1gcd(i,j ...

  9. 牛客小白月赛13 小A的回文串(Manacher)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个 ...

随机推荐

  1. windows 共存多个位数不同的jdk时,eclipse的报错对应措施

    1. 判断当前jdk的位数 # java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (bui ...

  2. 浅谈块元素绝对定位的margin属性

    对于div的绝对定位一直以为margin属性是无效的,只是通过top,left,bottom,right定位,然而今天的却发现不是这样的,于是对其做了些实验: 使用的HTML原始测试文件: <! ...

  3. Leetcode:Task Scheduler分析和实现

    题目大意:提供k个任务,这些任务没有依赖关系(即可以任意调度).CPU完成一个任务需要耗时一个时间片段,当执行完一个任务后,相同的任务必须在n个时间片段才能得以执行.请问CPU通过调度最快能在多少时间 ...

  4. SQLSERVER索引在什么情况下会失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...

  5. Python:cmd传参

    假如你写了一个文件test.py,你需要三个参数,你运行时: python test.py arg1 arg2 arg3 在test.py中读取这几个参数: import sys print 'Num ...

  6. iBase4j前端01_bootstrap-suggest json-server模拟后台数据、bootstrap-suggest环境搭建、开启bootstrap-suggest的post和put请求

    1 准备 1.1 模拟的json数据 { "info": [ { "message": "信息", "value": [ ...

  7. Docker01 centos系统安装、centos安装docker、docker安装mongoDB

    1 centos系统安装 本博文是基于 centos6.5 的,利用VMware 虚拟机搭建 centos6.5 系统 1.1 centos6.5资源获取 1.2 安装 1.2.1 新建虚拟机 1.2 ...

  8. spring框架 事务 xml配置方式

    user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...

  9. 权限管理RBAC

    四张表: 1.module:id/name //模块 2.action:id /module_id/name //权限 3.user:id/name //用户表 4.group:id/user_id ...

  10. rpm遇到的坑-与VMP冲突

    rpm遇到的坑-与VMP冲突 摘自:https://blog.csdn.net/shijichao2/article/details/78797586 2017年12月13日 22:29:21 阅读数 ...